副問い合わせ式

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 第 9章関数と演算子 | 早送り | 次のページ

# 9.20. 副問い合わせ式

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

## 9.20.1. `EXISTS`

    EXISTS (subquery)

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

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

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

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

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

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

## 9.20.2. `IN`

    expression IN (subquery)

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

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

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

    row_constructor IN (subquery)

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

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

## 9.20.3. `NOT IN`

    expression NOT IN (subquery)

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

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

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

    row_constructor NOT IN (subquery)

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

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

## 9.20.4. `ANY`/`SOME`

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

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

`SOME`は`ANY`の同義語です。`IN`は`= ANY`と等価です。

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

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

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

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

See 項9.21.5 for details about the meaning of a row-wise comparison.

## 9.20.5. `ALL`

    expression operator ALL (subquery)

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

`NOT IN`は`<> ALL`と等価です。

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

    row_constructor operator ALL (subquery)

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

行に関する比較の意味については項9.21.5を参照してください。

## 9.20.6. 行に関する比較

    row_constructor operator (subquery)

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

行に関する比較の意味についての詳細は項9.21.5を参照してください。

前のページ | ホーム | 次のページ
ウィンドウ関数 | 上に戻る | 行と配列の比較