他のバージョンの文書 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を生じる場合、または右側の値に等しいものが無くて少なくとも一つの右辺の行がNULLを持つ場合、IN構文の結果は偽では無くNULLとなります。 これは、NULL値の論理的な組合せに対するSQLの通常の規則に従うものです。

9.17.2. NOT IN

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

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

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

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

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

9.17.3. ANY/SOME (配列)

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の論理式の通常規則で結合されます。 二つの行は対応する全ての構成要素が非NULLかつ等しい場合に等しいと見做されます。 一つでも構成要素が非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とみなされます。