他のバージョンの文書 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.17. 行と配列の比較

本節では、値グループ間の複数の比較を行う、複数の特別な構文について説明します。この形式は構文的には、前節の副問い合わせ形式と関係しています。しかし、副問い合わせを含みません。配列副式を含むこの形式はPostgreSQLの拡張です。この他はSQL準拠です。本節で記載した全ての式は結果として論理値(真/偽)を返します。

9.17.1. IN

expression IN (value[, ...])

右辺は括弧で括られたスカラ式のリストです。左辺の式の結果が右辺の式のいずれかと等しい場合、結果は"真"になります。これは以下の省略形です。

expression = value1
OR
expression = value2
OR
...

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

9.17.2. NOT IN

expression NOT IN (value[, ...])

右辺は括弧で括られたスカラ式のリストです。左辺の式の結果が右辺の式の全てと等しくない場合、結果は"真"です。これは以下の省略形です。

expression <> value1
AND
expression <> value2
AND
...

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

ティップ: 全ての場合において、x NOT IN yNOT (x IN y)と等価です。しかし、INを使用するよりもNOT INを使用する方が初心者がNULL値による間違いをしやすくなります。可能な限り条件を肯定的に表現することが最善です。

9.17.3. ANY/SOME (array)

expression operator ANY (array expression)
expression operator SOME (array expression)

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

SOMEANYの同義語です。

9.17.4. ALL(配列)

expression operator ALL (array expression)

右辺は括弧で括られた式で、配列値を返さなければなりません。左辺の式は配列の要素それぞれに対して、指定されたoperatorを使用して評価、比較されます。なお、operatorは結果として論理値を生成する必要があります。(配列の要素数がゼロである特別な場合を含む)全ての比較が真になる場合、ALLの結果は"真"です。1つでも偽の結果があると、結果は"偽"です。

9.17.5. 行に関しての比較

row_constructor operator row_constructor

両辺とも項4.2.11で説明する行コンストラクタです。この2つの行値は同じフィールド数でなければなりません。両辺はそれぞれ評価され、行として比較されます。行の比較では、現在=および<>演算子のみが使用可能です。それぞれ2つの行が等しい、もしくは等しくない場合、結果は"真"です。

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

row_constructor IS DISTINCT FROM row_constructor

この構文は<>行比較と似ていますが、NULL入力に対してNULLを生成しない点が異なります。その代わりに、全てのNULL値は非ULL値と等しくない(異なる)ものとみなされ、また、2つのNULLは等しい(異ならない)ものとみなされます。したがって、結果は常に真か偽となり、NULLにはなりません。

row_constructor IS NULL
row_constructor IS NOT NULL

この構文は行の値がNULLか非NULLかを検査します。行値は、少なくとも1つのフィールドがNULLでなければ、非NULLとみなされます。