5

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

postgresql8.4の配列操作にcontrib_int.sqlパッケージを使用しています。上記のクエリでは、NULL右側に配列があります。このNULL値のため、エラーがスローされます。

"ERROR:  array must not contain nulls"

誰かが配列からnull値を削除するのを手伝ってもらえますか?

4

1 に答える 1

11

1)PostgreSQL8.4以降では配列にNULL値を含めることができます

db=# SELECT ARRAY[5,NULL,6];
   array
------------
 {5,NULL,6}

2)ただし、標準のPostgreSQL8.4では1つの配列を別の配列から減算することはできません。

db=# SELECT ARRAY[1,2,3] - ARRAY[5,NULL,6];
ERROR:  operator does not exist: integer[] - integer[]

3)contribパッケージintarrayがインストールされているPostgreSQL8.4でこれを行うことができます。

4)ただし、NULL値を含む配列を減算することはできません。

5)Rubyで配列を減算することもできます。マニュアルのここ、またはSOのここを参照してください。


PostgreSQLで整数配列のNULLを置き換えるソリューション:

Postgres9.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()PostgreSQL8.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 に答える