5

选择数组[1,2,3] - 数组[5,NULL,6]

我在 postgresql 8.4 中使用 contrib _int.sql 包进行数组操作 在上面的查询NULL中,右侧有一个数组。由于这个 NULL 值,它会引发错误:

"ERROR:  array must not contain nulls"

谁能帮我从数组中删除空值?

4

1 回答 1

11

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


在 PostgreSQL 中替换整数数组中的 NULL 的解决方案:

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}

免责声明:这两个版本都不适合多维数组。

于 2011-10-19T16:10:06.527 回答