web-dev-qa-db-ja.com

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

テーブルがあります(avl_vehiculo_data_estatica)、JSON列(data_vehdatesta)そして、それに格納されている実際のJSON配列に要素を追加して、その内容を更新する必要があります。

実際の内容:

[{"iddata":"1","valor":"18"},{"iddata":"2","valor":"10"},{"iddata":"3","valor":"N/A"},{"iddata":"4","valor":"53"},{"iddata":"5","valor":"Agencia Vespucio Oeste"}]

望ましい内容:

[{"iddata":"1","valor":"18"},{"iddata":"2","valor":"10"},{"iddata":"3","valor":"N/A"},{"iddata":"4","valor":"53"},{"iddata":"5","valor":"Agencia Vespucio Oeste"}, {"iddata":"6","valor":"ACTIVO"}]

したがって、次の値を持つ新しいJSON配列要素を追加する必要があります。

{"iddata":"6","valor":"ACTIVO"}

私たちはいくつかのPostgreSQL JSON関連の演算子と関数を試しましたが、そのような更新を実現するための正しい組み合わせを見つけることができなかったため、提案が役立つ場合があります。

DBバージョン:

PostgreSQL 9.4.9 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit

PS:同様の question/answer がありますが、私たちの場合とまったく同じではありません。

1
Gonzalo Vasquez

|| 9.5+以降を使用している場合は、jsonbを連結します。

SELECT lhs::jsonb || rhs::jsonb
FROM ( VALUES 
  (
    '[{"iddata":"1","valor":"18"},{"iddata":"2","valor":"10"},{"iddata":"3","valor":"N/A"},{"iddata":"4","valor":"53"},{"iddata":"5","valor":"Agencia Vespucio Oeste"}]',
    '{"iddata":"6","valor":"ACTIVO"}'
  )
) AS t(lhs,rhs);

出力:

[{"valor": "18", "iddata": "1"}, {"valor": "10", "iddata": "2"}, {"valor": "N/A", "iddata": "3"}, {"valor": "53", "iddata": "4"}, {"valor": "Agencia Vespucio Oeste", "iddata": "5"}, {"valor": "ACTIVO", "iddata": "6"}]

明示的なキャストはnotである必要があることに注意してください。正当な理由がない限り、最初はタイプをJSONBとして保存することをお勧めします。

2
Evan Carroll