7.20.3 IN述語
複数の条件値のうち,どれか1つの条件値を満たすデータを検索する際にIN述語を使用します。
- 〈この項の構成〉
(1) 指定形式
IN述語::={値式|行値構成子} 〔IS〕 〔NOT〕 IN {({値式|行値構成子}〔,{値式|行値構成子}〕…)|表副問合せ}
(2) 指定形式の説明
- {値式|行値構成子}:
IN述語の評価対象を,IN述語の左側に値式または行値構成子の形式で指定します。
評価対象と比較する条件値を,IN述語の右側に値式または行値構成子の形式で指定します。
IN述語の左側(右側)の値式または行値構成子の意味を次に示します。-
値式の場合
上の図の値式1がIN述語の左側の値式(IN述語の評価対象),値式2および値式3がIN述語の右側の値式(評価対象と比較する条件値)となります。値式については,「7.21 値式」を参照してください。
-
行値構成子の場合
上の図の行値構成子1がIN述語の左側の行値構成子(IN述語の評価対象),行値構成子2および行値構成子3がIN述語の右側の行値構成子(評価対象と比較する条件値)となります。行値構成子については「7.18 行値構成子」を参照してください。
指定規則を次に示します。
-
IN述語の左右に行値構成子を指定する場合,行値構成子要素を2つ以上指定してください。行値構成子要素を1つだけ指定した場合,その行値構成子は括弧で囲まれた値式として扱われます。
- 行値構成子として扱われる例
-
("C1","C2") IN ((1,'A'),(2,'B'))
- 値式として扱われる例
-
("C1") IN ((1),(2))
上記は「"C1" IN (1,2)」と同じです。
-
IN述語の左側に値式を指定する場合,IN述語の右側には値式だけを指定するか,または表副問合せを指定してください。
-
IN述語の左側に行値構成子を指定する場合,IN述語の右側には行値構成子だけを指定してください。
-
IN述語の右側に指定する値式または行値構成子は,30,000個まで指定できます。
-
- IS:
-
ISの指定は省略できます。指定のありなしに関係なく結果は同じになります。
- NOT:
-
NOTを指定すると,IN述語の右側に指定した条件値と一致しない値が検索対象になります。
NOTを指定しないと,IN述語の右側に指定した条件値と一致する値が検索対象になります。
- 表副問合せ:
-
表副問合せを指定します。表副問合せについては,「7.3 副問合せ」を参照してください。
なお,IN述語に表副問合せを指定した場合,作業表が作成されることがあります。作業表が作成される作業表用DBエリアの容量が正しく見積もられていない場合,性能低下の原因となることがあります。作業表用DBエリアの容量見積もりについては,マニュアルHADB システム構築・運用ガイドを参照してください。作業表の詳細については,マニュアルHADB AP開発ガイドの作業表が作成されるSQLを実行する際の考慮点を参照してください。
(3) 述語の評価
IN述語の結果が真となる条件を次の表に示します。
NOTの指定 |
IN述語の左側の指定値 |
IN述語の右側の指定値 |
IN述語の結果が真となる条件 |
---|---|---|---|
指定しない |
値式 |
値式 |
IN述語の左側の指定値が,右側の指定値のどれか1つ以上と一致する場合 |
行値構成子 |
行値構成子 |
||
値式 |
表副問合せ |
IN述語の左側の値式が,右側の表副問合せの結果行のどれか1つ以上と一致する場合 |
|
指定する |
値式 |
値式 |
IN述語の左側の指定値が,右側のすべての指定値と一致しない場合 |
行値構成子 |
行値構成子 |
||
値式 |
表副問合せ |
IN述語の左側の値式が,右側の表副問合せのすべての結果行と一致しない場合 |
NOTを指定しないIN述語の結果は,探索条件をOR条件でつないだ探索条件の結果と同じになり,NOTを指定するIN述語の結果は,探索条件をAND条件でつないだ探索条件の結果と同じになります。IN述語の指定と同じ結果になる探索条件を次の表に示します。
IN述語の指定 |
左記の指定と同じ結果になる探索条件 |
---|---|
値式1 IN (値式2,値式3,…)※ |
(値式1 = 値式2) OR (値式1 = 値式3) OR … |
行値構成子1 IN (行値構成子2,行値構成子3,…) |
(行値構成子1 = 行値構成子2) OR (行値構成子1 = 行値構成子3) OR … |
値式1 NOT IN (値式2,値式3,…)※ |
(値式1 <> 値式2) AND (値式1 <> 値式3) AND … |
行値構成子1 NOT IN (行値構成子2,行値構成子3,…) |
(行値構成子1 <> 行値構成子2) AND (行値構成子1 <> 行値構成子3) AND … |
- 注※
-
IN述語の右側に表副問合せを指定する場合は,その表副問合せの各結果行が(値式2,値式3,…)になるものとして読み替えてください。
IN述語の指定例と結果を次の表に示します。
IN述語の指定例 |
IN述語の結果 |
---|---|
1 IN (1,2,3) |
真 |
1 IN (1,2,ナル値) |
真 |
1 IN (2,3,4) |
偽 |
1 IN (2,3,ナル値) |
不定 |
(1,2) IN ((1,2),(2,3),(3,4)) |
真 |
(1,2) IN ((1,2),(2,3),(1,ナル値)) |
真 |
(1,2) IN ((2,3),(3,4),(4,5)) |
偽 |
(1,2) IN ((1,ナル値),(2,3),(3,4)) |
不定 |
1 NOT IN (2,3,4) |
真 |
1 NOT IN (1,2,3) |
偽 |
1 NOT IN (1,2,ナル値) |
偽 |
1 NOT IN (2,3,ナル値) |
不定 |
(1,2) NOT IN ((2,3),(3,4),(4,5)) |
真 |
(1,2) NOT IN ((1,2),(2,3),(3,4)) |
偽 |
(1,2) NOT IN ((1,2),(2,3),(1,ナル値)) |
偽 |
(1,2) NOT IN ((1,ナル値),(2,3),(3,4)) |
不定 |
(4) 規則
(a) IN述語の左側に値式を指定する場合の規則
-
IN述語の左側の値式に?パラメタを単独で指定できません。
-
IN述語の左側の値式の結果のデータ型と,IN述語の右側の値式の結果のデータ型が比較可能なデータ型になるように各値式を指定してください。比較可能なデータ型については,「6.2.2 変換,代入,比較できるデータ型」の「(1) 比較できるデータ型」を参照してください。
ただし,IN述語の左側の値式に日付,時刻,または時刻印を表す既定の入力表現を指定した場合,IN述語の右側の値式に日時データを指定することはできません。既定の入力表現については,「6.3.3 既定の文字列表現」を参照してください。
-
IN述語の左側の値式の結果がナル値の場合,IN述語の結果は不定となります。また,IN述語の右側のすべての値式の結果がナル値の場合も,IN述語の結果は不定となります。
-
IN述語の左右の値式には,配列データを指定できません。
-
表副問合せの結果が0行(空集合)の場合,IN述語の結果は偽になります。ただし,NOTを指定した場合は真になります。
-
表副問合せを指定した場合,表副問合せ中の選択式の数は1にしてください。
-
表副問合せを指定したIN述語は,HADBによって限定述語(=ANY指定)に書き換えられて処理されます。
-
表副問合せの選択式の値式には,配列データを指定できません。
(b) IN述語の左側に行値構成子を指定する場合の規則
-
IN述語の左右の行値構成子の行値構成子要素の数はすべて同じにしてください。
正しい指定例:("C1","C2") IN ((1,'A'),(2,'B'))
誤った指定例:("C1","C2") IN ((1,'A'),(2,'B','C'))
-
IN述語の左側の行値構成子中の各行値構成子要素の結果のデータ型と,IN述語の右側の行値構成子中の各行値構成子要素の結果のデータ型が比較可能なデータ型になるようにしてください。比較可能なデータ型については,「6.2.2 変換,代入,比較できるデータ型」の「(1) 比較できるデータ型」を参照してください。
(例)
ただし,IN述語の左側の行値構成子の行値構成子要素に日付,時刻,または時刻印を表す既定の入力表現を指定した場合,IN述語の右側の行値構成子の行値構成子要素に日時データを指定することはできません。既定の入力表現については,「6.3.3 既定の文字列表現」を参照してください。
-
IN述語の左側の行値構成子の行値構成子要素には,?パラメタを単独で指定できません。
-
IN述語の右側の行値構成子の行値構成子要素に?パラメタを単独で指定した場合,その?パラメタのデータ型には,比較相手となるIN述語の左側の行値構成子の行値構成子要素のデータ型が仮定されます。
-
IN述語の右側の行値構成子の行値構成子要素は値指定だけを指定できます。
-
IN述語の左側の行値構成子の行値構成子要素には,配列型のデータを指定できません。
-
IN述語の左側の行値構成子の行値構成子要素中には,次の値式を指定できません。
-
集合関数
-
スカラ副問合せ
-
配列要素参照
-
-
行値構成子を指定したIN述語は,次のどちらかに指定できます。
-
WHERE句
-
DELETE文またはUPDATE文のWHERE 探索条件
-
-
行値構成子を指定したIN述語は,CASE式の探索条件中には指定できません。
(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述語の指定です。
- 例題4
-
販売履歴表(SALESLIST)から,次の条件と一致する行を検索します。
-
顧客ID(USERID)がU001かつ商品コード(PUR-CODE)がP001
-
顧客ID(USERID)がU002かつ商品コード(PUR-CODE)がP001
SELECT "USERID","PUR-CODE","PUR-NUM" FROM "SALESLIST" WHERE ("USERID","PUR-CODE") IN (('U001','P001'), ('U002','P001'))
下線部分が行値構成子を指定したIN述語の指定です。
-