PostgreSQL

postgreSQLにはNVLがありません

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;

その他Oracleとの違いを以下まとめています

スポンサーリンク