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}
Отказ от ответственности : обе версии не подходят для многомерных массивов.