CakePHP: the rapid development php framework

PostgreSQLにおけるNVL関数の代替手段

投稿日: 2014-02-01

NVL関数というものを持っているDBMSがいくつかある。
例えばOracle、例えばInformix。
しかしPostgreSQLにはNVL関数がない。そこで代わりに登場するのがCOALESCE関数である。

そもそもNVL関数とはなんじゃ?というと
「抽出した値がNULLの場合、代替値を返す」
ものとなる。

SELECT nvl(order_date," ") FROM sales;
みたいな感じで、NULLが返ってきたら代わりにスペースを出力する、という動きをする。

PostgreSQLにおける代替関数は先ほども書いたCOALESCE。

SELECT COALESCE(order_date," ") FROM sales;
これにて同一挙動をする。

ただ正確にはNVL関数は該当する値がNULLの場合の代替値を返すのに対して、CALESCEはNULL でない自身の最初の引数を返す、というのが仕様であり引数は列挙できる。
上記のケースではorder_dateを最初に評価して、これがNULLだったので次の" "が使用されただけである。

SELECT COALESCE(sales_date, order_date, update_date, " ") FROM sales;
のようになっていた場合は、order_dateがNULLならsales_date、それもNULLならupdate_date。それでもNULLなら" "、という具合にIF-ELSE構文のような挙動をする関数である、ということは知っておいて損はないだろう。
たまたま今回はNVLの代替として登場したが、使い方によっては上記のようなIF-ELSEを実現できるのである。
……もっとも、そんなに頻繁にNULL値に遭遇するようなデータ構造のデータベースとは、あまりお付き合いしたくないけども(^^;

おまけ

せっかくなので他のDBMSにおけるNVL(orその互換対応)について調べてみた。
DBMSごとのnull変換互換性
DBMS機能備考
SybaseIsNullIS
MS SQL ServerIsNullIS:ま、元はSybaseだからね
MySQLIfNullISじゃなくてIF
MS AccessNzMS SQLと互換性ありません
OracleNVL本家?
COALESCEも持ってます
InformixNVLNVL派
PostgreSQLCOALESCE本稿のメインw
DB2COALESCE型が違うとエラー
FirebirdCOALESCE(Ver1.5+)
iNVL,i64NVL,sNVL
Ver1.5以上で有効
1.0では拡張モジュールで型別NVLがある

[一覧に戻る]