表 9.1に示すように、通常の比較演算子が使用可能です。
表9.1 比較演算子
| 演算子 | 説明 |
|---|---|
datatype < datatype
→ boolean
| 小なり |
datatype > datatype
→ boolean
| 大なり |
datatype <= datatype
→ boolean
| 等しいかそれ以下 |
datatype >= datatype
→ boolean
| 等しいかそれ以上 |
datatype = datatype
→ boolean
| 等しい |
datatype <> datatype
→ boolean
| 等しくない |
datatype != datatype
→ boolean
| 等しくない |
<>がSQL標準における「等しくない」の記法です。
!=はその別名で、構文解析のごく初期に<>に変換されます。
ですから!=演算子と<>演算子に異なる処理を行わせる実装はできません。
これらの比較演算子は、数値、文字列、日付、時刻データ型などの自然な順序付けを持つすべての組み込みデータ型に用意されています。 更に、要素となるデータ型が比較可能なら、配列、複合データ型、範囲は比較可能です。
通常関連性のあるデータ型も比較することができます。
たとえばinteger >bigintも可能です。
ある場合にはこれらの比較は「型をまたがる」比較演算子で直接実装されています。そうした演算子がなければ、パーサはより一般的ではない型をより一般的な型に変換して後者の比較演算子に適用します。
上で示したように、全ての比較演算子は二項演算子で、boolean型の値を返します。
ですから1 < 2 < 3のような式は(ブール値と3を比較する<演算子がないので)無効です。
下で示すBETWEEN述語を使って範囲検査を行ってください。
表 9.2に示すように、比較述語がいくつかあります。 これらは演算子と同様に振る舞いますが、標準SQLによって強制される特別の構文があります。
表9.2 比較述語
述語 説明 例 |
|---|
間にある(範囲の端点を含む)。
|
間にない(
|
2つの端点値をソートした上で、間にある。
|
2つの端点値をソートした上で、間にない。
|
NULLを比較可能な値とした上で、等しくない。
|
NULLを比較可能な値とした上で、等しい。
|
値がNULLかどうか検査する。
|
値がNULLではないかどうか検査する。
|
値がNULLかどうか検査する。(非標準構文) |
値がNULLではないかどうか検査する。(非標準構文) |
論理式の結果が真となるかどうか検査する。
|
論理式の結果が偽または不明となるかどうか検査する。
|
論理式の結果が偽となるかどうか検査する。
|
論理式の結果が真または不明となるかどうか検査する。
|
論理式の結果が不明となるかどうか検査する。
|
論理式の結果が真または偽となるかどうか検査する。
|
aBETWEENxANDy
は
a>=xANDa<=y
と同じです。
BETWEENは範囲内に含まれるとして端点値を扱うことに注意してください。
BETWEEN SYMMETRICは、ANDの左側の引数が右側の引数より小さいか、もしくは等しいという必要性が無い点を除きBETWEENと同様です。
この条件を満たしていない場合、2つの引数は自動的に交換されますので、常に空ではない範囲となります。
BETWEENの変種は通常の比較演算子を使って実装されており、比較可能なすべてのデータ型に対して使用できます。
BETWEEN構文中でANDを使用すると、ANDを論理演算子として使うこととの曖昧さが生じます。
これを解決するために、BETWEEN句の第2引数としては限定された式の種類のみが利用できます。
BETWEEN中で複雑な副式を使用する必要がある場合は、副式を括弧で囲んでください。
入力のどちらかがNULLの場合、通常の比較演算子は真や偽ではなく(「不明」を意味する)nullを生成します。
例えば7 = NULLはnullになります。7 <> NULLも同様です。
この動作が適切でない場合は、IS [ NOT ] DISTINCT FROM述語を使用してください。
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
非NULLの入力では、IS DISTINCT FROMは<>演算子と同じです。
しかし、入力がどちらもNULLの場合、これは偽を返し、片方の入力のみがNULLの場合は真を返します。
同様に、IS NOT DISTINCT FROMは非NULL入力では=と同じですが、両方の入力がNULLであれば真を、片方のみがNULLの場合は偽を返します。
このように、これらの述語はNULLを「不明な値」ではなく、通常の値かのように動作します。
値がNULLかNULLでないかを検証するには次の述語を使います。
expressionIS NULLexpressionIS NOT NULL
あるいは、これと同等の、非標準の述語も使えます。
expressionISNULLexpressionNOTNULL
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_expressionIS TRUEboolean_expressionIS NOT TRUEboolean_expressionIS FALSEboolean_expressionIS NOT FALSEboolean_expressionIS UNKNOWNboolean_expressionIS NOT UNKNOWN
これらは、常に真か偽を返し、演算項目がNULLであってもNULL値を返すことはありません。
NULL値が入力されると、「不明」という論理値として扱われます。
IS UNKNOWNとIS NOT UNKNOWNが、入力式が論理値型でなければならないという点を除き、それぞれ実質的にIS NULLとIS NOT NULLと同じであることに注意してください。
表 9.3に示すように、比較に関連した関数がいくつか使用可能です。
表9.3 比較関数