★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

9.22. 副問い合わせ式

本節ではPostgreSQLで使用できるSQL準拠の副問い合わせについて説明します。 本節で記載した全ての式は結果として論理値(真/偽)を返します。

9.22.1. EXISTS

EXISTS (subquery)

EXISTSの引数は、任意のSELECT文、つまり副問い合わせです。 副問い合わせはそれが何らかの行を返すか否かの決定のために評価されます。 もし1つでも行を返すのであれば、EXISTSの結果はtrue(真)となり、副問い合わせが行を返さない場合、EXISTSの結果はfalse(偽)となります。

副問い合わせは、取り囲んでいる問い合わせから変数を参照することができ、その値は副問い合わせの評価時には定数として扱われます。

この副問い合わせは通常、最後まで実行されず、少なくとも1つの行が返されたかどうかを判定し得るに足りる時点まで実行されます。 (シーケンス関数を呼び出すような)副作用のある副問い合わせを記述することは配慮不足です。副作用が生じるかどうかは予想できません。

結果は何らかの行が返されるのかのみに依存し、それらの行の内容には依存しないことから、副問い合わせの出力リストは通常重要ではありません。 よく使われるコーディング規約は、全てのEXISTSテストをEXISTS(SELECT 1 WHERE ...)といった形式で記述することです。 とは言っても、INTERSECTを使う副問い合わせのようにこの規則には例外があります。

以下の簡単な例はcol2上の内部結合に似ていますが、しかしたとえtab2の行といくつか一致したとしてもtab1のそれぞれの行に対して最大限1つの出力行を生成します。

SELECT col1
FROM tab1
WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

9.22.2. IN

expression IN (subquery)

右辺は括弧で括られた副問い合わせで、正確に1列を返すものでなければなりません。 左辺式は評価され、副問い合わせの結果行と比較されます。 副問い合わせの行のどれかと等しい場合、INの結果はtrue(真)です。 (副問い合わせが行を返さない場合を含め)等しい行が見つからない場合、結果はfalse(偽)です。

左辺の式がNULLを生じる場合、または右辺の値に等しいものがなくて少なくとも1つの右辺の行がNULLを持つ場合、IN構文の結果は偽ではなくNULLとなることに注意してください。 これは、NULL値の論理的な組み合わせに対するSQLの標準規則に従うものです。

EXISTSと同様、副問い合わせが完全に評価されることを前提としてはなりません。

row_constructor IN (subquery)

INのこの形式の左辺は、4.2.13で説明する、行のコンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。 左辺の式は副問い合わせの結果のそれぞれの行に対し、行に関して評価、比較が行われます。 副問い合わせの行に等しいものが見つかった場合、IN の結果はtrue(真)となります。 (副問い合わせが行を返さない場合を含め)等しい行が見つからない場合、結果はfalse(偽)です。

通常通り、行にあるNULL値はSQLの論理式の標準規則で結合されます。 2つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいとみなされます。 1つでも対応する構成要素が非NULLかつ等しくないものがあれば、2つの行は等しくないとみなされます。 それ以外の場合、その行の比較結果は不明(NULL)です。 行毎の結果すべてが不等もしくはNULLの場合、少なくとも1つのNULLがあると、INの結果はNULLとなります。

9.22.3. NOT IN

expression NOT IN (subquery)

右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。 左辺の式は副問い合わせ結果の行それぞれに対して評価、比較されます。 等しくない副問い合わせの行だけがある(副問い合わせが行を返さない場合を含む)と、NOT INの結果はtrue(真)です。 等しい行が1つでもあれば、結果はfalse(偽)です。

左辺の式でNULLが生じる場合、または右辺の値に等しいものがなく、少なくとも1つの右辺の式がNULLを生み出す場合、NOT IN構文の結果は真ではなくNULLとなることに注意してください。 これは、NULL値の論理的な組み合わせに対するSQLの標準規則に従うものです。

EXISTSと同様、副問い合わせが完全に評価されることを前提としてはなりません。

row_constructor NOT IN (subquery)

NOT INのこの形式の左辺は、4.2.13で説明する行コンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。 左辺の式は副問い合わせの結果のそれぞれの行に対し、評価、比較が行われます。 副問い合わせの行に不等のもののみが見つかった場合(副問い合わせが行を返さない場合を含む)、NOT INの結果はtrue(真)となります。 等しい行が1つでも見つかった場合、結果はfalse(偽)です。

通常通り、行にあるNULL値はSQLの論理式の標準規則で結合されます。 2つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいとみなされます。 1つでも構成要素が非NULLかつ等しくない場合、2つの行は等しくないとみなされます。 それ以外の場合、その行の比較結果は不明(NULL)です。 行毎の結果すべてが不等もしくはNULLの場合、少なくとも1つのNULLがあると、NOT INの結果はNULLとなります。

9.22.4. ANY/SOME

expression operator ANY (subquery)
expression operator SOME (subquery)

右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。 左辺の式は副問い合わせの結果行それぞれに対して、指定されたoperatorを使用して評価、比較されます。なお、operatorは結果として論理値を生成する必要があります。 真の結果が1つでもあると、ANYの結果はtrue(真)です。 真の結果がない(副問い合わせが行を返さない場合を含む)と、結果はfalse(偽)です。

SOMEANYの同義語です。 IN= ANYと等価です。

成功がなく、右辺の行が演算子の結果として1つでもNULLを生成した場合、ANY構文の結果は偽ではなくNULLになることに注意してください。 これは、NULL値の論理的な組み合わせに対するSQLの標準規則に従うものです。

EXISTSと同様、副問い合わせが完全に評価されると前提してはなりません。

row_constructor operator ANY (subquery)
row_constructor operator SOME (subquery)

ANYのこの形式の左辺は、4.2.13で説明されている行コンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。 左辺の式は副問い合わせの結果のそれぞれの行に対し、与えられたoperatorを使用して行に関する評価、比較が行われます。 比較の結果、副問い合わせの行のどれかに対して真となる場合、ANYの結果はtrue(真)です。 比較の結果、副問い合わせの全ての行に対して偽となる場合(副問い合わせが行を返さないという場合も含む)、結果はfalse(偽)です。 いかなる副問合せ行との比較の結果も偽を返さず、かつ、少なくとも1つの比較がNULLを返す場合、結果はNULLになります。

行コンストラクタ比較の意味についての詳細は9.23.5を参照して下さい。

9.22.5. ALL

expression operator ALL (subquery)

右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。 左辺の式は副問い合わせの結果行それぞれに対して、指定されたoperatorを使用して評価、比較されます。なお、operatorは結果として論理値を生成する必要があります。 全ての行が真になる場合(副問い合わせが行を返さない場合を含む)、ALLの結果はtrue(真)です。 1つでも偽の結果があると、結果はfalse(偽)です。 比較がどの行でも偽を返さず、かつ、少なくとも1つの行でNULLを返した場合、結果はNULLとなります。

NOT IN<> ALLと等価です。

EXISTSと同様、副問い合わせが完全に評価されることを前提としてはなりません。

row_constructor operator ALL (subquery)

ALLのこの形式の左辺は、4.2.13で説明する行コンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行にある式の数と正確に同じ数の列を返さなければなりません。 左辺の式は副問い合わせの結果のそれぞれの行に対し、与えられたoperatorを使用して行に関する評価、比較が行われます。 比較した結果、すべての副問い合わせ行に対して真を返す場合(副問い合わせが行を返さないという場合も含む)、ALLの結果はtrue(真)となります。 比較した結果、いずれかの副問い合わせ行で偽を返す場合、この結果はfalse(偽)となります。 比較結果がすべての副問い合わせ行に対して偽を返さず、少なくとも1行でNULLを返す場合、結果はNULLとなります。

行コンストラクタに関する比較の意味については9.23.5を参照してください。

9.22.6. 単独行に関する比較

row_constructor operator (subquery)

左辺は、4.2.13で説明されている行コンストラクタです。 右辺は括弧で括られた副問い合わせで、左辺の行とまったく同じ数の列を返さなければなりません。さらに、副問い合わせは複数行を返すことはできません。 (行をまったく返さない場合、結果はNULLとみなされます。) 左辺は副問い合わせの結果の単一行に対し行全体で評価、比較が行われます。

行コンストラクタに関する比較の意味についての詳細は9.23.5を参照してください。