33

データベース(postgres 9.2.1)にjsonblobを含むテキストフィールドがあります。明らかに、すべてが1行になっていることを除けば、これに似たものに見えます。

{
  "keyword": {
    "checked": "1",
    "label": "Keyword"
  },
  "agency_name": {
    "checked": "0",
    "label": "Agency Name"
  }
}

次のように、json配列に要素を追加する必要があります。

{
  "keyword": {
    "checked": "1",
    "label": "Keyword"
  },
  "something_new": {
    "checked": "1",
    "label": "Something New"
  },
  "agency_name": {
    "checked": "0",
    "label": "Agency Name"
  }
}

新しい配列要素の配置についてはそれほど心配していません。エージェンシー名の後にある可能性があります。postgresでこれを行う簡単な方法はありますか?

4

7 に答える 7

40

PG9.5.1 にアップグレードすると、SQL 演算子を使用して||jsonb をマージできます。

select '{"a":1}'::jsonb || '{"a":2, "b":2}'::jsonb

戻ります{"a": 2, "b": 2}

pg9.5.1にアップグレードできない場合、私見ですが、コードでジョブを実行することをお勧めします。古い jsonb 文字列をマップとして解析し、マップを更新してから、文字列に変換して db-record を更新できます。

そして、JSONB フィールドを更新(追加) したい場合:

UPDATE <table>
SET <field-name> = <field-name> || '{"a": 1}'::jsonb
WHERE id = <some id>
于 2016-03-04T07:10:39.203 に答える
10

私も同じ問題を抱えていましたが、新しい要素をjsonb []に動的に追加したかったのです。

column_jsonb[] = [{"name":"xyz","age":"12"}] とします。

UPDATE table_name
   SET column_jsonb[] = array_append(column_jsonb[],'{"name":"abc","age":"22"}');

結果: [{"name":"xyz","age":"12"},{"name":"abc","age":"22"}]

于 2016-07-06T16:26:54.553 に答える
5

PostgreSQL には、JSON をサポートする機能はまだあまりありませんarray_to_json。 JSON に戻す前の要素。

おそらく最善の方法は、PL 言語を使用して JSON を操作することです。明らかなものの 1 つは、PostgreSQL で JavaScript プログラミング機能を提供する PLV8 です。それに応じて JSON blob を操作する JavaScript でユーザー定義関数を記述します。

もちろん、Java、Python、Perl などの他の多くの PL 言語は、JSON データの操作に適している可能性があり、システムへのインストールがより簡単になる可能性があります。これらを設定しておけば、それぞれにユーザー定義関数を書き込むことができます。

于 2012-11-28T22:52:28.173 に答える
4

バージョン 9.5 では、create_missing=TRUE でjsonb_set関数が提供されます。それ以外の場合は、次のハックを使用して情報を追加します。

SELECT (trim( trailing '}' from data::text) || ', "c":2}')::json

より正しい方法で新しい値を追加/置換するには:

UPDATE t
SET data=t3.data

FROM t AS t1
INNER JOIN
(
  SELECT id, json_object_agg(t.k,t.v)
  FROM
    (
      SELECT *
      FROM (SELECT id, json_object_keys(data) as k, data->json_object_keys(data) as v FROM t) as t2
      WHERE t.k != 'c'

      UNION ALL
      SELECT id, 'c'::text as k, '"new value"'::json as v FROM t1
    ) as t3
  GROUP by id
) as t4 ON (t1.id=t4.id)

キーを削除するには:

UPDATE t
SET data=t3.data

FROM t AS t1
INNER JOIN
(
  SELECT id, json_object_agg(t.k,t.v)
  FROM (SELECT id, json_object_keys(data) as k, data->json_object_keys(data) as v FROM t) as t2
  WHERE t.k != 'c'
  GROUP by id
) as t4 ON (t1.id=t4.id)
于 2015-08-01T10:36:59.240 に答える