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述語は真になります。
-
値式1の結果が,値式2以降のどれかの値式の結果と一致する場合
-
値式1の結果が,表副問合せの任意の結果行と一致する場合
NOTを指定した場合,次に示す条件を満たす行に対してIN述語は真になります。
-
値式1の結果が,値式2以降のすべての値式の結果と一致しない場合
-
値式1の結果が,表副問合せのすべての結果行と一致しない場合
(4) 規則
(a) IN (値式2〔,値式3〕…)を指定する場合の規則
-
値式1に?パラメタを単独で指定できません。
-
値式2以降の値式は,30,000個まで指定できます。
-
値式1の結果のデータ型が,値式2以降の値式の結果のデータ型と比較可能なデータ型になるように各値式を指定してください。比較可能なデータ型については,「6.2.2 変換,代入,比較できるデータ型」の「(1) 比較できるデータ型」を参照してください。
ただし,値式1に日付,時刻,または時刻印を表す既定の入力表現を指定した場合,値式2以降に日時データを指定することはできません。既定の入力表現については,「6.3.3 既定の文字列表現」を参照してください。
-
値式1の結果がナル値の場合,IN述語の結果は不定となります。また,値式2以降のすべての値式の結果がナル値の場合も,IN述語の結果は不定となります。
-
IN述語中の値式(値式1および値式2以降の値式)には,配列データを指定できません。
(b) IN 表副問合せを指定する場合の規則
-
表副問合せの結果が0行(空集合)の場合,IN述語の結果は偽になります。ただし,NOTを指定した場合は真になります。
-
表副問合せを指定した場合,表副問合せ中の選択式の数は1にしてください。
-
表副問合せを指定したIN述語は,HADBによって限定述語(=ANY指定)に書き換えられて処理されます。
-
表副問合せの選択式の値式には,配列データを指定できません。
(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述語の指定です。