SELECT ARRAY [1,2,3] - ARRAY [5,NULL,6]
我在postgresql 8.4中使用contrib _int.sql包进行数组操作
在上面的查询中,右侧数组中有NULL
。由于此NULL值,它会引发错误:
"ERROR: array must not contain nulls"
有人可以帮我从数组中删除空值吗?
答案 0 :(得分:10)
1)数组可以在 PostgreSQL 8.4 +
中包含NULL值db=# SELECT ARRAY[5,NULL,6];
array
------------
{5,NULL,6}
2)但是不能在标准PostgreSQL 8.4中从另一个ARRAY中减去一个ARRAY。
db=# SELECT ARRAY[1,2,3] - ARRAY[5,NULL,6];
ERROR: operator does not exist: integer[] - integer[]
3)可以在安装了contrib package intarray的PostgreSQL 8.4中执行此操作。
4)但是你不能减去包含NULL值的数组。
5)你可以也减去 Ruby 中的数组。请参阅here in the manual或here on SO。
Postgres 9.3 或更高版本 array_replace(anyarray, NULL, anyelement)
。 The manual.
旧版本:
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;
PostgreSQL 8.4 中引入了 unnest()
对于旧版本,您可以使用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}
免责声明:这两个版本都不适合多维数组。