目的
PostgreSQLで配列の長さを返す関数がちょっと直感と反する動きをします。
test=# select array_length(ARRAY[1]::BIGINT[], 1);
array_length
--------------
1
(1 行)
test=# select array_length(ARRAY[]::BIGINT[], 1);
array_length
--------------
(1 行)
test=# select array_length(NULL::BIGINT[], 1);
array_length
--------------
(1 行)
空配列もNULLも0を返してほしいです。
ちなみにこうするとうまくいきます。
test=# select coalesce(array_length(ARRAY[]::BIGINT[], 1), 0);
coalesce
----------
0
(1 行)
これ全部書くと長いのでストアードプロシージャを作ってラップします。
コード
CREATE OR REPLACE FUNCTION uv_array_length(
p_target_array ANYARRAY
,p_dimension INT DEFAULT 1
) RETURNS BIGINT AS $FUNCTION$
DECLARE
BEGIN
RETURN COALESCE(array_length(p_target_array, p_dimension), 0);
END;
$FUNCTION$ LANGUAGE plpgsql STABLE;
test=# select uv_array_length(ARRAY[]::BIGINT[]);
uv_array_length
-----------------
0
(1 行)