表9.1「比較演算子」に示す、通常の比較演算子が使用可能です。
表9.1 比較演算子
演算子 | 説明 |
---|---|
< | 小なり |
> | 大なり |
<= | 等しいかそれ以下 |
>= | 等しいかそれ以上 |
= | 等しい |
<> または != | 等しくない |
!=
演算子は構文解析で<>
に変換されます。
!=
演算子と<>
演算子に異なる処理を行わせる実装はできません。
比較演算子は関連性のある全てのデータ型で使用できます。
全ての比較演算子は二項演算子で、boolean
型の値を返します。1 < 2 < 3
のような式は(ブール値と3
を比較する<
演算子がないので)無効です。
a
BETWEENx
ANDy
は
a
>=x
ANDa
<=y
と同じです。
BETWEEN
は範囲内に含まれるとして終点値を扱うことに注意してください。
NOT BETWEEN
はその反対の比較をします(指定した値は包括しません)。
a
NOT BETWEENx
ANDy
は
a
<x
ORa
>y
と同一です。
BETWEEN SYMMETRIC
は、AND
の左側の引数が右側の引数より小さいか、もしくは等しいという必要性が無い点を除きBETWEEN
と同じです。
この条件を満たしていない場合、2つの引数は自動的に交換されますので、常に空ではない範囲となります。
値がNULLかNULLでないかを検証するには次の構文を使います。
expression
IS NULLexpression
IS NOT NULL
あるいは、これと同等の、非標準の構文も使えます。
expression
ISNULLexpression
NOTNULL
NULL
とNULL
とは「等しい」関係にはありませんので、
と記述してはいけません
(NULL値は不明の値を表しているため、不明な値同士が同じかどうかは識別できません)。
これは標準SQLに従った動作です。
expression
= NULL
アプリケーションによっては、
が、expression
= NULLexpression
がNULL値と評価されるのであれば真を返すことを期待することがあります。
こうしたアプリケーションは標準SQLに従うように改修することを強く推奨します。
しかし、それができなければtransform_null_equalsを使用することで対応することができます。
これを有効にした場合、PostgreSQLはx = NULL
句をx IS NULL
に変換します。
expression
が行値の場合、行式自体がNULLまたは、行のフィールドすべてがNULLの場合にIS NULL
は真となります。一方IS NOT NULL
は、行式自体が非NULLかつ、行のフィールドすべてが非NULLの場合に真となります。
この動作により、IS NULL
およびIS NOT NULL
は行値評価式に対し常に反対の結果を返しません。つまりNULLと非NULLの値の両方を含む行値式はどちらの試験でも偽を返します。
この定義は標準SQLに従ったもので、8.2より前のバージョンのPostgreSQLにおける一貫性のない動作から変更されました。
入力のどちらかがNULLの場合、通常の比較演算子は真や偽ではなく(「不明」を意味する)nullを生成します。
例えば7 = NULL
はnullになります。7 <> NULL
も同様です。
この動作が適切でない場合は、IS [ NOT ] DISTINCT FROM
構文を使用してください。
expression
IS DISTINCT FROMexpression
expression
IS NOT DISTINCT FROMexpression
非NULLの入力では、IS DISTINCT FROM
は<>
演算子と同じです。
しかし、入力がどちらもNULLの場合、これは偽を返し、片方の入力のみがNULLの場合は真を返します。
同様に、IS NOT DISTINCT FROM
は非NULL入力では=
と同じですが、両方の入力がNULLであれば真を、片方のみがNULLの場合は偽を返します。
このように、これらの構文はNULLを「不明な値」ではなく、通常の値かのように動作します。
expression
IS TRUEexpression
IS NOT TRUEexpression
IS FALSEexpression
IS NOT FALSEexpression
IS UNKNOWNexpression
IS NOT UNKNOWN
これらは、常に真か偽を返し、演算項目がNULLであってもNULL値を返すことはありません。
NULL値が入力されると、「不明」という論理値として扱われます。
IS UNKNOWN
とIS NOT UNKNOWN
が、入力式が論理値型でなければならないという点を除き、それぞれ実質的にIS NULL
とIS NOT NULL
と同じであることに注意してください。