PostgreSQL には SQLServer の ISNULL や Oracle の NVL に対応する関数がないので値が NULL の場合に別の値に変換して取得するには COALESCE で代用するが多いようです。
ないなら作ってみようということで自作の ISNULL 関数を作成します。
PostgreSQLのISNULL、NVL関数対応
PostgreSQL には ISNULL や NVL 関数に対応するものがないので、自作します。
PostgreSQL の関数はオーバーロードが可能なので、自作するには ISNULL 関数の引数の型、戻り値の型を「なんでもOK」にしてやる必要があります。
でないと integer や char などの呼び出す側での引数の型の分だけ ISNULL 関数を作らなくてはなりません。
これは無駄なので調べると PostgreSQL には anyelement 型という「なんでもOK型(正式名称は多様型)」があるのでこれを使います。
ISNULL関数作成
ISNULL 関数を作る前に準備をします。
まずはテーブル作成。
CREATE TABLE test_table
(
name VARCHAR(20)
,age smallint
,data_type_numeric numeric
)
データを挿入しておきます。
INSERT INTO test_table
VALUES ( 'Taro',20 ),(NULL,30),('Hanako',NULL)
ISNULL関数 その1
実際に作成する ISNULL 関数の SQL は以下の通りです。
CREATE OR REPLACE FUNCTION isNull( v1 anyelement, v2 anyelement)
RETURNS anyelement AS $$
DECLARE
result ALIAS FOR $0 ;
BEGIN
result := v1;
IF v1 IS NULL THEN
result := v2;
END IF;
RETURN result;
END;
$$ LANGUAGE plpgsql
第 1 引数に NULL かどうか判定する値、第 2 引数に NULL の場合に返す値を指定して呼び出します。
SELECT
ISNULL( name, 'No name') AS name
,ISNULL( age, 300) AS age
FROM test_table;
上記の実行結果は以下の通りです。
| Taro | 20 |
| No name | 30 |
| Hanako | 300 |
ISNULL関数 その2
単純に CASE WHEN を使ってもできそうです。
CREATE OR REPLACE FUNCTION ISNULL(v1 anyelement ,v2 anyelement) RETURNS anyelement AS $$ SELECT CASE WHEN v1 IS NULL THEN v2 ELSE target END; $$ LANGUAGE SQL;
SELECT
ISNULL( name, 'No name') AS name
,ISNULL( age, 300) AS age
FROM test_table;
上記の実行結果も、その1と同様に以下の通り正常に動作します。
| Taro | 20 |
| No name | 30 |
| Hanako | 300 |
注意点
上記のその1、その2とも引数の型はなんでも良いのですが、numeric などの一部の型では明示的な型の変換が必要になります。
SELECT
ISNULL( data_type_numeric, cast (10 as numeric)) AS name
FROM test_table;
