本節では、値グループ間の複数の比較を行なう、複数の特別な構文について説明します。 この形式は構文的には、前節の副問い合わせ形式と関係しています。 しかし、副問い合わせを含みません。 配列副式を含むこの形式はPostgreSQLの拡張です。 この他はSQL準拠です。 本節で記載したすべての式は結果として論理値(真/偽)を返します。
expression IN (value[, ...])
右辺は括弧で括られたスカラ式のリストです。 左辺の式の結果が右辺の式のいずれかと等しい場合、結果は"真"になります。 これは以下の省略形です。
expression = value1 OR expression = value2 OR ...
左辺の式がNULLを生じる場合、または右側の値に等しいものが無くて少なくとも一つの右辺の行がNULLを持つ場合、IN構文の結果は偽では無くNULLとなります。 これは、NULL値の論理的な組合せに対するSQLの通常の規則に従うものです。
expression NOT IN (value[, ...])
右辺は括弧で括られたスカラ式です。 左辺の式の結果が右辺の式のすべてと等しくない場合、結果は"真"です。 これは以下の省略形です。
expression <> value1 AND expression <> value2 AND ...
左辺の式でNULLが生じる場合、または右側の値に等しいものがなく、少なくとも一つの右辺の式がNULLを産みだす場合、NOT IN構文の結果は真では無くNULLとなることに注意してください。 これは、NULL値の論理的な組合せに対するSQLの通常の規則に従うものです。
ティップ: すべての場合において、x NOT IN yはNOT (x IN y)と等価です。 しかし、INを使用するよりもNOT INを使用する方が初心者がNULL値による間違いをし易くなります。 可能な限り条件を肯定的に表現することが最善です。
expression operator ANY (array expression) expression operator SOME (array expression)
右辺は括弧で括られた式で、配列値を返さなければなりません。 左辺の式は配列要素それぞれに対して、指定されたoperatorを使用して評価、比較されます。 なお、operatorは結果として論理値を生成する必要があります。 真の結果が1つでもあると、ANYの結果は"真"です。 (配列の要素数がゼロである特別な場合を含む)真の結果がないと、結果は"偽"です。
SOMEはANYの同義語です。
expression operator ALL (array expression)
右辺は括弧で括られた式で、配列値を返さなければなりません。 左辺の式は配列の要素それぞれに対して、指定されたoperatorを使用して評価、比較されます。 なお、operatorは結果として論理値を生成する必要があります。 (配列の要素数がゼロである特別な場合を含む)すべての比較が真になる場合、ALLの結果は"真"です。 1つでも偽の結果があると、結果は"偽"です。
(expression [, expression ...]) operator (expression [, expression ...])
両辺ともスカラ式のリストです。 この2つのリストは同じ長さでなければなりません。 両辺はそれぞれ評価され、行として比較されます。 行の比較では、現在=および<>演算子が使用可能です。 それぞれ2つの行が等しい、もしくは、等しくない場合、結果は"真"です。
いつもの通り、行にあるNULL値は、SQLの論理式の通常規則で結合されます。 二つの行は対応するすべての構成要素が非NULLかつ等しい場合に等しいと見做されます。 一つでも構成要素が非NULLかつ等しくない場合、2つの行は等しくないと見做されます。 それ以外その行の比較結果は不明(NULL)です。