フィールドの1つがJSON配列であるテーブルがあります。既存の値を上書きせずに、受信したJSON配列をそのフィールドに追加する必要があります。
そんな感じ:
CREATE OR REPLACE FUNCTION add_array(
array_received json[])
RETURNS void AS
$BODY$
update table set _array_field = _array_field | array_received ...;
$BODY$
LANGUAGE plpgsql VOLATILE;
私はplv8言語でそれをしました。 Windowsの場合、ユーザーは以下からパッケージを取得します
PosgreSQL 9.3
PostgreSQL 9.4
PostgreSQL 9.5
PostgreSQL 9.6 Beta1
次に、このコマンドを実行します
CREATE EXTENSION plv8
これが機能
CREATE OR REPLACE FUNCTION jsonarray_append(row_id bigint, append json[]) RETURNS void AS $$
var json_array = [];
var json_result = plv8.execute('select json_array_field from sometable where _id=$1',[row_id]);
if(json_result[0].json_array_field != null){
for(var i=0; i < append.length; i++){
json_result[0].json_array_field .Push(append[i]);
}
json_array = json_result[0].json_array_field;
}
else{
json_array = append;
}
plv8.execute('update sometable set json_array_field = $1 where _id=$2', [json_array, row_id]);
$$ LANGUAGE plv8 IMMUTABLE STRICT;
9.5より前では、次のように _json_array_elements
_ とarray_to_json(array_agg())
を使用できます。
_SELECT array_to_json(array_agg(x))
FROM (
SELECT jsonb_array_elements('[1,2,3]'::jsonb)
UNION ALL SELECT '4'::jsonb
) AS t(x);
_
このようにARRAY
コンストラクタを使用してこれを書くこともできます。
_SELECT array_to_json(ARRAY(
SELECT jsonb_array_elements('[1,2,3]'::jsonb)
UNION ALL SELECT '4'::jsonb
));
_