Заменить значения NULL в массиве в PostgreSQL - PullRequest
5 голосов
/ 19 октября 2011

SELECT ARRAY [1,2,3] - ARRAY [5, NULL, 6]

Я использую пакет contrib _int.sql для операций с массивами в postgresql 8.4 В приведенном выше запросе есть NULL в правой части массива. Из-за этого значения NULL выдается ошибка:

"ERROR:  array must not contain nulls"

Может кто-нибудь помочь мне удалить нулевые значения из массива?

1 Ответ

10 голосов
/ 19 октября 2011

1) Массивы могут содержать значения NULL в PostgreSQL 8.4 +

db=# SELECT ARRAY[5,NULL,6];
   array
------------
 {5,NULL,6}

2) Но вы не можете вычесть один Массив из другого в стандартном PostgreSQL 8.4.

db=# SELECT ARRAY[1,2,3] - ARRAY[5,NULL,6];
ERROR:  operator does not exist: integer[] - integer[]

3) Вы можете сделать это в PostgreSQL 8.4 с установленным intarray пакета contrib .

4) Но вы не можете вычесть массивы, содержащие значения NULL.

5) Вы можете также вычитать массивы в Ruby . См. здесь в руководстве или здесь на SO .


Решение заменить NULL в целочисленном массиве в PostgreSQL:

Postgres 9.3 или более поздней версии имеет array_replace(anyarray, NULL, anyelement) для любого массива. Руководство.

В старых версиях:

CREATE OR REPLACE FUNCTION f_int_array_replace_null (int[], int)
RETURNS int[] AS
$$
SELECT ARRAY (
    SELECT COALESCE(x, $2)
    FROM   unnest($1) x);
$$ LANGUAGE SQL IMMUTABLE;

unnest() был представлен в PostgreSQL 8.4
Для более старых версий вы можете использовать generate_series():

CREATE OR REPLACE FUNCTION f_int_array_replace_null (int[], int)
RETURNS int[] AS
$$
SELECT ARRAY (
    SELECT COALESCE($1[i], $2)
    FROM   generate_series(1, array_upper($1, 1)) x(i));
$$ LANGUAGE SQL IMMUTABLE; 

Звоните:

event=# SELECT f_int_array_replace_null (ARRAY[5,NULL,6], 0);
 f_int_array_replace_null
--------------------------
 {5,0,6}

Отказ от ответственности : обе версии не подходят для многомерных массивов.

...