Передача пустого массива в качестве параметра в функции Greenplum - PullRequest
1 голос
/ 27 мая 2020

У меня есть эта функция:

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?

...