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值的数组.
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)
免责声明:两个版本都不适合多维数组.
| 归档时间: |
|
| 查看次数: |
7155 次 |
| 最近记录: |