• PostgreSQL

    PostgreSQLのJSON配列に要素を追加する方法

    PostgreSQLはカラムにJSONが使えます(まぁ、最近のSQLはだいたいサポートしているが)。JSONの特定の要素が配列で、その配列にデータを追加する際、なんか変なクエリ書くだけでJSONのそれ以外の部分が消えてしまうおそれがあります。

    例えば下記のようなJSONが json カラムにあるとします。

    { "str": "data", "obj": { "key": "value" }, "array": [{ "elm": "1" }, { "elm": "2" }] }

    この時、 array{ "elm": "3" } を末尾に追加するクエリは下記のようになります。

    UPDATE table_name SET json = JSON_SET( json, '{array}', COALESCE(json->'array', '[]'::JSON) || '[{"elm": "3"}]'::JSON ) WHERE id = 1;

    JSON_SET の代わりに || を利用することでも似たような感じの動作になります。

    UPDATE table_name SET json = json || json_build_object('array', COALESCE(json->'array', '[]'::JSON) || '[{"elm": "3"}]'::JSON) WHERE id = 1;

    || は配列の結合演算子で、 COALESCE(json->'array', '[]'::JSONB)jsonarray が存在しない場合に空の配列を返すための処理です。

    JSONBの場合はJSONB用の演算子があるので、JSON_の部分をJSONB_にすればだいたい動きます。