★PostgreSQLカンファレンス2021 11月12日開催/チケット販売中★
他のバージョンの文書 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

9.2. 比較関数および演算子

表 9.1に示すように、通常の比較演算子が使用可能です。

表9.1 比較演算子

演算子説明
datatype < datatypeboolean 小なり
datatype > datatypeboolean 大なり
datatype <= datatypeboolean 等しいかそれ以下
datatype >= datatypeboolean 等しいかそれ以上
datatype = datatypeboolean 等しい
datatype <> datatypeboolean 等しくない
datatype != datatypeboolean 等しくない

注記

<>がSQL標準における等しくないの記法です。 !=はその別名で、構文解析のごく初期に<>に変換されます。 ですから!=演算子と<>演算子に異なる処理を行わせる実装はできません。

これらの比較演算子は、数値、文字列、日付、時刻データ型などの自然な順序付けを持つすべての組み込みデータ型に用意されています。 更に、要素となるデータ型が比較可能なら、配列、複合データ型、範囲は比較可能です。

通常関連性のあるデータ型も比較することができます。 たとえばinteger >bigintも可能です。 ある場合にはこれらの比較は型をまたがる比較演算子で直接実装されています。そうした演算子がなければ、パーサはより一般的ではない型をより一般的な型に変換して後者の比較演算子に適用します。

上で示したように、全ての比較演算子は二項演算子で、boolean型の値を返します。 ですから1 < 2 < 3のような式は(ブール値と3を比較する<演算子がないので)無効です。 下で示すBETWEEN述語を使って範囲検査を行ってください。

表 9.2に示すように、比較述語がいくつかあります。 これらは演算子と同様に振る舞いますが、標準SQLによって強制される特別の構文があります。

表9.2 比較述語

述語

説明

datatype BETWEEN datatype AND datatypeboolean

間にある(範囲の端点を含む)。

2 BETWEEN 1 AND 3t

2 BETWEEN 3 AND 1f

datatype NOT BETWEEN datatype AND datatypeboolean

間にない(BETWEENの否定)。

2 NOT BETWEEN 1 AND 3f

datatype BETWEEN SYMMETRIC datatype AND datatypeboolean

2つの端点値をソートした上で、間にある。

2 BETWEEN SYMMETRIC 3 AND 1t

datatype NOT BETWEEN SYMMETRIC datatype AND datatypeboolean

2つの端点値をソートした上で、間にない。

2 NOT BETWEEN SYMMETRIC 3 AND 1f

datatype IS DISTINCT FROM datatypeboolean

NULLを比較可能な値とした上で、等しくない。

1 IS DISTINCT FROM NULL t (NULLではなく)

NULL IS DISTINCT FROM NULL f (NULLではなく)

datatype IS NOT DISTINCT FROM datatypeboolean

NULLを比較可能な値とした上で、等しい。

1 IS NOT DISTINCT FROM NULL f (NULLではなく)

NULL IS NOT DISTINCT FROM NULL t (NULLではなく)

datatype IS NULLboolean

値がNULLかどうか検査する。

1.5 IS NULLf

datatype IS NOT NULLboolean

値がNULLではないかどうか検査する。

'null' IS NOT NULLt

datatype ISNULLboolean

値がNULLかどうか検査する。(非標準構文)

datatype NOTNULLboolean

値がNULLではないかどうか検査する。(非標準構文)

boolean IS TRUEboolean

論理式の結果が真となるかどうか検査する。

true IS TRUEt

NULL::boolean IS TRUE f (NULLではなく)

boolean IS NOT TRUEboolean

論理式の結果が偽または不明となるかどうか検査する。

true IS NOT TRUEf

NULL::boolean IS NOT TRUE t (NULLではなく)

boolean IS FALSEboolean

論理式の結果が偽となるかどうか検査する。

true IS FALSEf

NULL::boolean IS FALSE f (NULLではなく)

boolean IS NOT FALSEboolean

論理式の結果が真または不明となるかどうか検査する。

true IS NOT FALSEt

NULL::boolean IS NOT FALSE t (NULLではなく)

boolean IS UNKNOWNboolean

論理式の結果が不明となるかどうか検査する。

true IS UNKNOWNf

NULL::boolean IS UNKNOWN t (NULLではなく)

boolean IS NOT UNKNOWNboolean

論理式の結果が真または偽となるかどうか検査する。

true IS NOT UNKNOWNt

NULL::boolean IS NOT UNKNOWN f (NULLではなく)


BETWEEN述語は範囲の検査を次のように単純にします。

a BETWEEN x AND y

a >= x AND a <= 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 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

NULLNULLとは等しい関係にはありませんので、expression = NULLと記述してはいけません (NULL値は不明の値を表しているため、不明な値同士が同じかどうかは識別できません)。

ヒント

アプリケーションによっては、expression = NULLが、expressionがNULL値と評価されるのであれば真を返すことを期待することがあります。 こうしたアプリケーションは標準SQLに従うように改修することを強く推奨します。 しかし、それができなければtransform_null_equalsを使用することで対応することができます。 これを有効にした場合、PostgreSQLx = 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 UNKNOWNIS NOT UNKNOWNが、入力式が論理値型でなければならないという点を除き、それぞれ実質的にIS NULLIS NOT NULLと同じであることに注意してください。

表 9.3に示すように、比較に関連した関数がいくつか使用可能です。

表9.3 比較関数

関数

説明

num_nonnulls ( VARIADIC "any" ) → integer

非NULLの引数の数を返す。

num_nonnulls(1, NULL, 2)2

num_nulls ( VARIADIC "any" ) → integer

NULL引数の数を返す。

num_nulls(1, NULL, 2)1