このセクションでは、PostgreSQLで使用できるSQL準拠のサブクエリ式について説明します。 このセクションで説明されているすべての式形式は、ブール値 (true/false) の結果を返します。
出口
EXISTS (サブクエリ)EXISTSの引数は、任意のSELECTステートメントまたはサブクエリです。 サブクエリは、行を返すかどうかを判断するために評価されます。 少なくとも1つの行を返す場合、EXISTSの結果は "true" です。サブクエリが行を返さない場合、EXISTSの結果は "false" です。
サブクエリは、周囲のクエリからの変数を参照することができ、これは、サブクエリの任意の1つの評価中に定数として働く。
サブクエリは通常、少なくとも1つの行が返されるかどうかを判断するのに十分な時間だけ実行され、完了までは実行されません。 副作用 (シーケンス関数の呼び出しなど) があるサブクエリを作成するのは賢明ではありません。副作用が発生するかどうかは予測できない可能性があります。
結果は、いずれかの行が返されるかどうかにのみ依存し、それらの行の内容には依存しないため、サブクエリの出力リストは通常重要ではありません。 一般的なコーディング規則では、すべてのEXISTSテストをEXISTS(SELECT 1 WHERE ...) の形式で記述します。 ただし、INTERSECTを使用するサブクエリなど、このルールには例外があります。
この単純な例は、col2の内部結合のようなものですが、一致するtab2行が複数ある場合でも、tab1行ごとに最大で1つの出力行が生成されます。
SELECT col1
タブ1から
WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2); イン
式IN (サブクエリ)右側は括弧付きのサブクエリで、正確に1つの列を返す必要があります。 左側の式が評価され、サブクエリ結果の各行と比較されます。 等しいサブクエリ行が見つかった場合、INの結果は「true」になります。 等しい行が見つからない場合 (サブクエリが行を返さない場合を含む) 、結果は「false」になります。
左側の式がnullをもたらす場合、または等しい右側の値がなく、少なくとも1つの右側の行がnullをもたらす場合、INコンストラクトの結果はfalseではなくnullになることに注意してください。 これは、ヌル値のブール組合せに対するSQLの通常の規則に従う。
EXISTSと同様に、サブクエリが完全に評価されると仮定するのは賢明ではありません。
row_constructor IN (サブクエリ)この形式のINの左側は行コンストラクタです。 右側は括弧で囲まれたサブクエリで、左側の行にある式と同じ数の列を返す必要があります。 左側の式が評価され、サブクエリ結果の各行と行ごとに比較されます。 等しいサブクエリ行が見つかった場合、INの結果は「true」になります。 等しい行が見つからない場合 (サブクエリが行を返さない場合を含む) 、結果は「false」になります。
通常どおり、行のnull値はSQLブール式の通常の規則に従って結合されます。 2つの行は、対応するすべてのメンバーがnullでなく、等しい場合に等しいと見なされます。対応するメンバーがnullでなく、等しくない場合、行は等しくなります。それ以外の場合、その行の比較の結果は不明 (null) です。 すべての行ごとの結果が等しくないか、またはヌルであり、少なくとも1つのヌルを有する場合、INの結果はヌルである。
NOT IN
式NOT IN (サブクエリ)右側は括弧付きのサブクエリで、正確に1つの列を返す必要があります。 左側の式が評価され、サブクエリ結果の各行と比較されます。 等しくないサブクエリ行のみが見つかった場合 (サブクエリが行を返さない場合を含む) 、NOT INの結果は「true」です。 等しい行が見つかった場合、結果は「false」です。
左側の式がnullを生成する場合、または等しい右側の値がなく、少なくとも1つの右側の行がnullを生成する場合、NOT INコンストラクトの結果はtrueではなくnullになります。 これは、ヌル値のブール組合せに対するSQLの通常の規則に従う。
EXISTSと同様に、サブクエリが完全に評価されると仮定するのは賢明ではありません。
row_constructor NOT IN (サブクエリ)この形式のNOT INの左側は行コンストラクタです。 右側は括弧で囲まれたサブクエリで、左側の行にある式と同じ数の列を返す必要があります。 左側の式が評価され、サブクエリ結果の各行と行ごとに比較されます。 等しくないサブクエリ行のみが見つかった場合 (サブクエリが行を返さない場合を含む) 、NOT INの結果は「true」です。 等しい行が見つかった場合、結果は「false」です。
通常どおり、行のnull値はSQLブール式の通常の規則に従って結合されます。 2つの行は、対応するすべてのメンバーがnullでなく、等しい場合に等しいと見なされます。対応するメンバーがnullでなく、等しくない場合、行は等しくなります。それ以外の場合、その行の比較の結果は不明 (null) です。 行ごとの結果がすべて等しくないか、またはnullで、少なくとも1つのnullがある場合、NOT INの結果はnullです。
ANY/SOME
式演算子ANY (サブクエリ)
式演算子SOME (サブクエリ) 右側は括弧付きのサブクエリで、正確に1つの列を返す必要があります。 左側の式が評価され、指定された演算子を使用してサブクエリ結果の各行と比較されます。 ANYの結果は、真の結果が得られた場合に「真」である。 真の結果が見つからない場合 (サブクエリが行を返さない場合を含む) 、結果は「false」です。
SOMEはANYの同義語です。INは= ANYに等しい。
成功がなく、少なくとも1つの右側の行が演算子の結果に対してnullを生成する場合、ANY構成の結果はfalseではなくnullになります。 これは、ヌル値のブール組合せに対するSQLの通常の規則に従う。
EXISTSと同様に、サブクエリが完全に評価されると仮定するのは賢明ではありません。
row_constructor演算子ANY (サブクエリ)
row_constructor演算子SOME (サブクエリ) ANYのこの形式の左側は行コンストラクタです。 右側は括弧で囲まれたサブクエリで、左側の行にある式と同じ数の列を返す必要があります。 左側の式は、指定された演算子を使用して、サブクエリ結果の各行と行ごとに評価および比較されます。 ANYの結果は、比較がいずれかのサブクエリ行に対してtrueを返す場合、「true」です。 すべてのサブクエリ行 (サブクエリが行を返さない場合を含む) に対して比較結果がfalseを返す場合、結果は "false" になります。 サブクエリ行との比較がtrueを返さず、少なくとも1つの比較がNULLを返す場合、結果はNULLになります。
すべて
式演算子ALL (サブクエリ)右側は括弧付きのサブクエリで、正確に1つの列を返す必要があります。 左側の式が評価され、指定された演算子を使用してサブクエリ結果の各行と比較されます。 すべての行がtrueをもたらす場合 (サブクエリが行を返さない場合を含む) 、ALLの結果は「true」です。 偽の結果が見つかった場合、結果は「偽」です。 サブクエリ行との比較がfalseを返さず、少なくとも1つの比較がNULLを返す場合、結果はNULLになります。
NOT INは <> ALLに相当します。
EXISTSと同様に、サブクエリが完全に評価されると仮定するのは賢明ではありません。
row_constructor演算子ALL (サブクエリ)この形式のALLの左側は行コンストラクタです。 右側は括弧で囲まれたサブクエリで、左側の行にある式と同じ数の列を返す必要があります。 左側の式は、指定された演算子を使用して、サブクエリ結果の各行と行ごとに評価および比較されます。 ALLの結果は、比較がすべてのサブクエリ行に対してtrueを返す場合 (サブクエリが行を返さない場合を含む) 、"true" になります。 比較が任意のサブクエリ行に対してfalseを返す場合、結果は「false」になります。 サブクエリ行との比較がfalseを返さず、少なくとも1つの比較がNULLを返す場合、結果はNULLになります。
単一行の比較
row_constructor演算子 (サブクエリ)左側は行コンストラクタです。 右側は括弧で囲まれたサブクエリで、左側の行にある式と同じ数の列を返す必要があります。 さらに、サブクエリは複数の行を返すことはできません。 (ゼロ行を返す場合、結果はnullになります。) 左側が評価され、行ごとに単一のサブクエリ結果行と比較されます。