表 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ではないかどうか検査する。(非標準構文) |
論理式の結果が真となるかどうか検査する。
|
論理式の結果が偽または不明となるかどうか検査する。
|
論理式の結果が偽となるかどうか検査する。
|
論理式の結果が真または不明となるかどうか検査する。
|
論理式の結果が不明となるかどうか検査する。
|
論理式の結果が真または偽となるかどうか検査する。
|
a
BETWEENx
ANDy
は
a
>=x
ANDa
<=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
述語を使用してください。
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の値の両方を含む行値式はどちらの試験でも偽を返します。
たとえば、
SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same'); SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows SELECT ROW(table.*) IS NOT NULL FROM table; -- detect all-non-null rows SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- detect at least one null in rows
場合によっては、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 比較関数