Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.19.3 IN述語

複数の条件値のうち,どれか1つの条件値を満たすデータを検索する際にIN述語を使用します。

〈この項の構成〉

(1) 指定形式

IN述語::=値式1 〔IS〕 〔NOT〕 IN {(値式2〔,値式3〕…)|表副問合せ

(2) 指定形式の説明

値式1

IN述語の評価対象列を指定します。値式の形式で指定します。値式については,「7.20 値式」を参照してください。

IS

ISの指定は省略できます。指定のありなしに関係なく結果は同じになります。

NOT

NOTを指定すると,IN以降に指定した値式と一致しない値が検索対象になります。

IN (値式2〔,値式3〕…)

条件値を値式の形式で指定します。指定した条件値のどれかと,値式1の結果が一致すると,IN述語はになります。

IN 表副問合せ

表副問合せを指定します。表副問合せについては,「7.3 副問合せ」を参照してください。

なお,IN述語に表副問合せを指定した場合,作業表が作成されることがあります。作業表が作成される作業表用DBエリアの容量が正しく見積もられていない場合,性能低下の原因となることがあります。作業表用DBエリアの容量見積もりについては,マニュアルHADB システム構築・運用ガイドを参照してください。作業表の詳細については,マニュアルHADB AP開発ガイド作業表が作成されるSQLを実行する際の考慮点を参照してください。

(3) 述語の評価

次に示す条件を満たす行に対してIN述語はになります。

NOTを指定した場合,次に示す条件を満たす行に対してIN述語はになります。

(4) 規則

(a) IN (値式2〔,値式3〕…)を指定する場合の規則

  1. 値式1に?パラメタを単独で指定できません。

  2. 値式2以降の値式は,30,000個まで指定できます。

  3. 値式1の結果のデータ型が,値式2以降の値式の結果のデータ型と比較可能なデータ型になるように各値式を指定してください。比較可能なデータ型については,「6.2.2 変換,代入,比較できるデータ型」の「(1) 比較できるデータ型」を参照してください。

    ただし,値式1に日付,時刻,または時刻印を表す既定の入力表現を指定した場合,値式2以降に日時データを指定することはできません。既定の入力表現については,「6.3.3 既定の文字列表現」を参照してください。

  4. 値式1の結果がナル値の場合,IN述語の結果は不定となります。また,値式2以降のすべての値式の結果がナル値の場合も,IN述語の結果は不定となります。

  5. IN述語中の値式(値式1および値式2以降の値式)には,配列データを指定できません。

(b) IN 表副問合せを指定する場合の規則

  1. 表副問合せの結果が0行(空集合)の場合,IN述語の結果は偽になります。ただし,NOTを指定した場合は真になります。

  2. 表副問合せを指定した場合,表副問合せ中の選択式の数は1にしてください。

  3. 表副問合せを指定したIN述語は,HADBによって限定述語(=ANY指定)に書き換えられて処理されます。

  4. 表副問合せの選択式の値式には,配列データを指定できません。

(5) 例題

例題1

販売履歴表(SALESLIST)から,商品コードP001またはP003の商品を2011/9/5以降に購入した顧客の,顧客ID(USERID),商品コード(PUR-CODE),購入日(PUR-DATE)を検索します。

SELECT "USERID","PUR-CODE","PUR-DATE"
    FROM "SALESLIST"
       WHERE "PUR-CODE" IN ('P001','P003')
       AND "PUR-DATE">=DATE'2011-09-05'

下線部分がIN述語の指定です。

例題2

販売履歴表(SALESLIST)から,顧客ID(USERID),商品コード(PUR-CODE),販売個数(PUR-NUM)を検索します。ただし,顧客ID(USERID)がU00212およびU00358の顧客は,検索対象外とします。

SELECT "USERID","PUR-CODE","PUR-NUM"
    FROM "SALESLIST"
       WHERE "USERID" NOT IN ('U00212','U00358')

下線部分がIN述語の指定です。

例題3

顧客表(USERSLIST)と販売履歴表(SALESLIST)から,商品コード(PUR-CODE)がP001の商品を購入した顧客の情報を検索します。

SELECT * FROM "USERSLIST"
    WHERE "USERID" IN (SELECT "USERID" FROM "SALESLIST"
                            WHERE "PUR-CODE"='P001')

下線部分がIN述語の指定です。