ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

Oracle Database の LNNVL を PostgreSQL で実現する

Oracle Database には LNNVL というファンクションがあります。

LNNVL(condition)

LNNVL の説明を Oracle Database 12c R2 マニュアルから引用します。

LNNVLは、条件のオペランドの1つまたは両方がNULLの可能性がある場合にその条件を簡単に評価する方法を提供します。このファンクションは問合せのWHERE句で、またはWHEN条件として検索CASE式で使用できます。このファンクションは、引数として条件を取り、その条件がFALSEまたはUNKNOWNの場合はTRUEを戻し、TRUEの場合はFALSEを戻します。LNNVLは、スカラー式を指定できる場所であればどこでも指定でき、有効ではないが、発生する可能性があるNULLを評価するためにIS [NOT] NULL、ANDまたはOR条件が必要であるようなコンテキストでも指定できます。

(中略)

a = 2およびb=NULLの場合のLNNVLからの戻り値を次の表に示します。

条件 条件の真偽 LNNVLの戻り値
a = 1 FALSE TRUE
a = 2 TRUE FALSE
a IS NULL FALSE TRUE
b = 1 UNKNOWN TRUE
b IS NULL TRUE FALSE
a = b UNKNOWN TRUE
LNNVL

LNNVL の条件(condition)と戻り値を真理値表で整理します。

条件 戻り値
FALSE TRUE
TRUE FALSE
UNKNOWN TRUE

PostgreSQL には LNNVL に相当する関数が用意されていませんが、COALESCE と NOT を組み合わせることで、同じことを表現することができます。

COALESCE(NOT(condition), TRUE)

これが Oracle のマニュアルに記載の LNNVL の振る舞いと同等であることを PostgreSQL 10.3 で確認しました。