选择数组[1,2,3] - 数组[5,NULL,6]
我在 postgresql 8.4 中使用 contrib _int.sql 包进行数组操作 在上面的查询NULL
中,右侧有一个数组。由于这个 NULL 值,它会引发错误:
"ERROR: array must not contain nulls"
谁能帮我从数组中删除空值?
选择数组[1,2,3] - 数组[5,NULL,6]
我在 postgresql 8.4 中使用 contrib _int.sql 包进行数组操作 在上面的查询NULL
中,右侧有一个数组。由于这个 NULL 值,它会引发错误:
"ERROR: array must not contain nulls"
谁能帮我从数组中删除空值?
1) PostgreSQL 8.4+中的数组可以包含 NULL 值
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 中安装contrib 包 intarray来执行此操作。
4) 但是你不能减去包含 NULL 值的数组。
5)您还可以在Ruby中减去数组。请参阅手册中的此处或此处的 SO。
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}
免责声明:这两个版本都不适合多维数组。