在PostgreSQL中替换数组中的NULL值

时间:2011-10-19 09:15:06

标签: arrays postgresql null rails-postgresql

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

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

"ERROR:  array must not contain nulls"

有人可以帮我从数组中删除空值吗?

1 个答案:

答案 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 manualhere on SO


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

对于任何数组,

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}

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