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)
は json
の array
が存在しない場合に空の配列を返すための処理です。
JSONBの場合はJSONB用の演算子があるので、JSON_の部分をJSONB_にすればだいたい動きます。