У меня есть эта функция:
CREATE OR REPLACE FUNCTION array_drop_null(anyarray)
RETURNS anyarray
AS $$
BEGIN
RETURN array(SELECT x FROM UNNEST($1) x WHERE x IS NOT NULL);
END;
$$ LANGUAGE plpgsql IMMUTABLE;
Я могу получить правильное поведение с непустым массивом:
asset=# select 1 FROM array_drop_null(ARRAY[1,2,NULL]::int[] ) x WHERE ARRAY_LENGTH(x, 1) = 2;
?column?
----------
1
(1 row)
Однако, когда я передаю пустой массив или NULL, я получил это:
asset=# select array_drop_null('{}'::int[] )
asset-# ;
ERROR: plpgsql functions cannot take type anyarray
CONTEXT: compile of PL/pgSQL function "array_drop_null" near line 0
asset=# SELECT '{}'::INT[];
int4
------
{}
(1 row)
Когда я передаю столбец с TEXT[]
функции, она возвращает {}
, если запись столбца NULL
.
Другой случай:
asset=# select 1 FROM array_drop_null(ARRAY[NULL]::int[] ) x WHERE x IS NULL;
?column?
----------
1
(1 row)
Он не возвращает {}
, вместо этого он возвращает NULL
.
Я запутался в поведении. Может кто-нибудь объяснить, что происходит? Как правильно передать пустой массив или NULL
?