表 9.1に示すように、通常の比較演算子が使用可能です。
表9.1 比較演算子
演算子 | 説明 |
---|---|
< | 小なり |
> | 大なり |
<= | 等しいかそれ以下 |
>= | 等しいかそれ以上 |
= | 等しい |
<> または != | 等しくない |
!=
演算子は構文解析で<>
に変換されます。
!=
演算子と<>
演算子に異なる処理を行わせる実装はできません。
比較演算子は関連性のある全てのデータ型で使用できます。
全ての比較演算子は二項演算子で、boolean
型の値を返します。1 < 2 < 3
のような式は(ブール値と3
を比較する<
演算子がないので)無効です。
表 9.2に示すように、比較の述語がいくつかあります。 これらは演算子と同様に振る舞いますが、標準SQLによって強制される特別の構文があります。
表9.2 比較述語
述語 | 説明 |
---|---|
a BETWEEN x AND y | 間にある |
a NOT BETWEEN x AND y | 間にない |
a BETWEEN SYMMETRIC x AND y | 間にある(比較値をソートする) |
a NOT BETWEEN SYMMETRIC x AND y | 間にない(比較値をソートする) |
a IS DISTINCT FROM b | 等しくない(NULLは通常の値と同様に扱う) |
a IS NOT DISTINCT FROM b | 等しい(NULLは通常の値と同様に扱う) |
expression IS NULL | NULLである |
expression IS NOT NULL | NULLでない |
expression ISNULL | NULLである(非標準の構文) |
expression NOTNULL | NULLでない(非標準の構文) |
boolean_expression IS TRUE | 真である |
boolean_expression IS NOT TRUE | 偽あるいは不明である |
boolean_expression IS FALSE | 偽である |
boolean_expression IS NOT FALSE | 真あるいは不明である |
boolean_expression IS UNKNOWN | 不明である |
boolean_expression IS NOT UNKNOWN | 真あるいは偽である |
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を生成します。
例えば7 = NULL
はnullになります。7 <> NULL
も同様です。
この動作が適切でない場合は、IS [ NOT ] DISTINCT FROM
述語を使用してください。
a
IS DISTINCT FROMb
a
IS NOT DISTINCT FROMb
非NULLの入力では、IS DISTINCT FROM
は<>
演算子と同じです。
しかし、入力がどちらもNULLの場合、これは偽を返し、片方の入力のみがNULLの場合は真を返します。
同様に、IS NOT DISTINCT FROM
は非NULL入力では=
と同じですが、両方の入力がNULLであれば真を、片方のみがNULLの場合は偽を返します。
このように、これらの述語はNULLを「不明な値」ではなく、通常の値かのように動作します。
値がNULLかNULLでないかを検証するには次の述語を使います。
expression
IS NULLexpression
IS NOT NULL
あるいは、これと同等の、非標準の述語も使えます。
expression
ISNULLexpression
NOTNULL
NULL
とNULL
とは「等しい」関係にはありませんので、
と記述してはいけません
(NULL値は不明の値を表しているため、不明な値同士が同じかどうかは識別できません)。
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の値の両方を含む行値式はどちらの試験でも偽を返します。
場合によっては、row
IS DISTINCT FROM NULL
あるいはrow
IS NOT DISTINCT FROM NULL
と記述する方が望ましいことがあるでしょう。
これらは単に行全体の値がNULLかどうかを検査し、行のフィールドについての追加的検査を全く行わないからです。
boolean_expression
IS TRUEboolean_expression
IS NOT TRUEboolean_expression
IS FALSEboolean_expression
IS NOT FALSEboolean_expression
IS UNKNOWNboolean_expression
IS NOT UNKNOWN
これらは、常に真か偽を返し、演算項目がNULLであってもNULL値を返すことはありません。
NULL値が入力されると、「不明」という論理値として扱われます。
IS UNKNOWN
とIS NOT UNKNOWN
が、入力式が論理値型でなければならないという点を除き、それぞれ実質的にIS NULL
とIS NOT NULL
と同じであることに注意してください。
表 9.3に示すように、比較に関連した関数がいくつか使用可能です。
表9.3 比較関数