NVLとCOALESCEとCASE文
今日後輩が、「PostgreSQLにNVLないんですかぁ?」と聞いてきたのですが、、、ありません。NVLはOracle独自の関数です。(実は私も、PostgreSQLに移ってきた時には戸惑いました)
検証データ
udondb=# \pset null '(null)'
Null表示は"(null)"です。
udondb=# select * from fruit order by 1;
fid | name | price | memo
-----+--------+--------+--------------------------
101 | バナナ | 200 | まだ少し青い
102 | リンゴ | 100 | (null)
103 | メロン | 300 | もう少し待つとさらに良い
104 | 葡萄 | 280 | (null)
105 | みかん | (null) | 欠品
(5 行)
udondb=#
上記のようなテーブルがある時、以下2つのSQLは同じ結果を返します。
COALESCE関数でNULLを判定する
select fid,name,price,coalesce(t.memo,'食べごろ') as memo from fruit t order by 1;
CASE文で表現する
select fid,name,price,case when t.memo is null then '食べごろ' else t.MEMO end memo from fruit t order by 1;
udondb=# select fid,name,price,coalesce(t.memo,'食べごろ') as memo from fruit t
udondb-# order by 1;
fid | name | price | memo
-----+--------+--------+--------------------------
101 | バナナ | 200 | まだ少し青い
102 | リンゴ | 100 | 食べごろ
103 | メロン | 300 | もう少し待つとさらに良い
104 | 葡萄 | 280 | 食べごろ
105 | みかん | (null) | 欠品
(5 行)
udondb=# select fid,name,price,case when t.memo is null then '食べごろ' else t.MEMO end memo
udondb-# from fruit t order by 1;
fid | name | price | memo
-----+--------+--------+--------------------------
101 | バナナ | 200 | まだ少し青い
102 | リンゴ | 100 | 食べごろ
103 | メロン | 300 | もう少し待つとさらに良い
104 | 葡萄 | 280 | 食べごろ
105 | みかん | (null) | 欠品
(5 行)
udondb=#
NVL版 PostgreSQLでは動作しません。Oracleのみ有効です
select fid,name,price,nvl(t.memo,'食べごろ') as memo from fruit t order by 1;