PostgreSQL 9.6.5文書 | |||
---|---|---|---|
前のページ | 上に戻る | 第 9章関数と演算子 | 次のページ |
表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 | 真あるいは偽である |
BETWEEN述語は範囲の検査を次のように単純にします。
a BETWEEN x AND y
は
a >= x AND a <= y
と同じです。 BETWEENは範囲内に含まれるとして終点値を扱うことに注意してください。 NOT BETWEENはその反対の比較をします(指定した値は包括しません)。
a NOT BETWEEN x AND y
は
a < x OR a > y
と同一です。 BETWEEN SYMMETRICは、ANDの左側の引数が右側の引数より小さいか、もしくは等しいという必要性が無い点を除きBETWEENと同様です。 この条件を満たしていない場合、2つの引数は自動的に交換されますので、常に空ではない範囲となります。
入力のどちらかがNULLの場合、通常の比較演算子は真や偽ではなく("不明"を意味する)nullを生成します。 例えば7 = NULLはnullになります。7 <> NULLも同様です。 この動作が適切でない場合は、IS [ NOT ] DISTINCT FROM述語を使用してください。
a IS DISTINCT FROM b a IS NOT DISTINCT FROM b
非NULLの入力では、IS DISTINCT FROMは<>演算子と同じです。 しかし、入力がどちらもNULLの場合、これは偽を返し、片方の入力のみがNULLの場合は真を返します。 同様に、IS NOT DISTINCT FROMは非NULL入力では=と同じですが、両方の入力がNULLであれば真を、片方のみがNULLの場合は偽を返します。 このように、これらの述語はNULLを"不明な値"ではなく、通常の値かのように動作します。
値がNULLかNULLでないかを検証するには次の述語を使います。
expression IS NULL expression IS NOT NULL
あるいは、これと同等の、非標準の述語も使えます。
expression ISNULL expression NOTNULL
NULLとNULLとは"等しい"関係にはありませんので、expression = NULLと記述してはいけません (NULL値は不明の値を表しているため、不明な値同士が同じかどうかは識別できません)。
ティップ: アプリケーションによっては、expression = NULLが、expressionが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 TRUE boolean_expression IS NOT TRUE boolean_expression IS FALSE boolean_expression IS NOT FALSE boolean_expression IS UNKNOWN boolean_expression IS NOT UNKNOWN
これらは、常に真か偽を返し、演算項目がNULLであってもNULL値を返すことはありません。 NULL値が入力されると、"不明"という論理値として扱われます。 IS UNKNOWNとIS NOT UNKNOWNが、入力式が論理値型でなければならないという点を除き、それぞれ実質的にIS NULLとIS NOT NULLと同じであることに注意してください。
表9-3に示すように、比較に関連した関数がいくつか使用可能です。