IN 述部

IN 述部は、ある値または複数の値を値の集合と比較します。

構文図を読む構文図をスキップする
>>-+-expression1--+-----+--IN--+-(--fullselect1--)---------+-+-><
   |              '-NOT-'      |    .-,---------------.    | |   
   |                           |    V                 |    | |   
   |                           +-(------expression2---+--)-+ |   
   |                           '---expression3-------------' |   
   '-row-value-expression--+-----+--IN--(--fullselect2--)----'   
                           '-NOT-'                               

expression1 を指定した場合、IN 述部は 1 つの値を値のセットと比較します。fullselect1 を指定した場合、全選択は単一の結果列を戻す必要があり、NULL か非 NULL かは関係なく、戻す値の数は任意です。expression1 のデータ・タイプと、fullselect1expression2expression3 の結果列のデータ・タイプとの間には互換性がなければなりません。各変数は、ホスト構造や変数の宣言規則に従って記述されている構造や変数を識別していなければなりません。

行値式 が指定されている場合、IN 述部は値を値の集合と比較します。

  • fullselect2 の最外部の選択リストでは、SELECT * を使用できません。
  • fullselect2 の結果表の列の数は、row-value-expression の数と同じでなければなりません。row-value-expression の対応する式のデータ・タイプと、fullselect2 の対応する結果列のデータ・タイプとの間には、互換性がなければなりません。row-value-expression の各式の値が、fullselect2 の対応する結果列の値と比較されます。

この述部の値は、以下のように指定された演算子によって異なります。

  • 演算子が IN である場合、述部の結果は次のようになります。
    • fullselect2 から返される行のうち、少なくとも 1 つが row-value-expression と等しい場合は、真。
    • fullselect2 の結果が空の場合や、fullselect2 から返される行のうち、row-value-expression と等しい行がまったくない場合は、偽。
    • それ以外の場合は、不明 (つまり、fullselect2 から戻される行の少なくとも 1 つに NULL 値があるために、row-value-expressionfullselect2 から戻される行の比較が不明と評価され、 かつ fullselect2 から戻された行がどれも row-value-expression と等しくない場合)。
  • 演算子が NOT IN である場合、述部の結果は次のようになります。
    • fullselect2 の結果が空の場合、または row-value-expressionfullselect2 から戻されるどの行とも等しくない場合は、真。
    • row-value-expressionfullselect2 から戻される行の少なくとも 1 つと等しい場合は、偽。
    • その他の場合は、不明 (fullselect2 から返される行のうち、少なくとも 1 つの行が NULL 値になっていることが原因で、row-value-expressionfullselect2 から返される行との比較が、fullselect2 から返されるどの行についても真にならなければ、row-value-expressionfullselect2 から返される行との比較は不明と評価されます)。

IN 述部は、以下のように他の述部と同等です。

IN 述部 同等述部
expression IN (expression) expression = expression
expression IN (fullselect) expression = ANY (fullselect)
expression NOT IN (fullselect) expression <> ALL (fullselect)
expression IN (expression1, expression2, ..., expressionn) expression IN (SELECT * FROM R)

ここで T は単一の行を持つ表で、R は次の全選択によって形成された一時表です。
   SELECT expression1 FROM T
     UNION
   SELECT expression2 FROM T
     UNION
       .
       .
       .
     UNION
   SELECT expressionn FROM T
row-value-expression IN (fullselect) row-value-expression = SOME ( fullselect)
row-value-expression IN (fullselect) row-value-expression = ANY ( fullselect)
row-value-expression NOT IN (fullselect) row-value-expression <> ALL ( fullselect)

IN 述部のオペランドが異なるデータ・タイプまたは異なる属性を持つ場合は、 IN 述部の演算のデータ・タイプの決定に使用される規則は、 UNION、UNION ALL、EXCEPT、および INTERSECT の場合に使用される規則です。説明は、結果のデータ・タイプに関する規則を参照してください。

IN 述部のオペランドが異なる CCSID を持つストリングである場合に、変換するオペランドの決定に使用される規則は、ストリングの結合の演算で使用される規則です。 説明については、ストリングを結合する演算に適用される変換規則を参照してください。

述部の対応するオペランドが SBCS データ、混合データ、または Unicode データであり、 そのステートメントが実行される時点で有効な照合順序が *HEX でない場合は、 そのオペランドの比較は、オペランドの重み付けされた値を使用して行われます。 値の重み付けは、該当の照合順序に基づいています。

   DEPTNO IN ('D01', 'B01', 'C01')
 
   EMPNO IN(SELECT EMPNO FROM EMPLOYEE WHERE WORKDEPT = 'E11')