在PostgreSQL中替换数组中的NULL值

Raf*_*fiu 5 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"
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我从数组中删除空值吗?

Erw*_*ter 10

1)数组在PostgreSQL 8.4+中可以包含NULL值

db=# SELECT ARRAY[5,NULL,6];
   array
------------
 {5,NULL,6}
Run Code Online (Sandbox Code Playgroud)

2)但是你不能在标准PostgreSQL 8.4中从另一个ARRAY中减去一个ARRAY.

db=# SELECT ARRAY[1,2,3] - ARRAY[5,NULL,6];
ERROR:  operator does not exist: integer[] - integer[]
Run Code Online (Sandbox Code Playgroud)

3)你可以在安装了contrib包intarray的 PostgreSQL 8.4中做到这一点.

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;
Run Code Online (Sandbox Code Playgroud)

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; 
Run Code Online (Sandbox Code Playgroud)

呼叫:

event=# SELECT f_int_array_replace_null (ARRAY[5,NULL,6], 0);
 f_int_array_replace_null
--------------------------
 {5,0,6}
Run Code Online (Sandbox Code Playgroud)

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