簡體   English   中英

如何更新 PostgreSQL 中的 JSON 字段?

[英]How do I update a JSON field in PostgreSQL?

我有一個表,其中包含一個名為data的列,其中包含一些 JSON。 如果表中任何給定行的data列不是 null,它將包含一個 JSON 編碼的 object 和一個名為companyDescription的鍵。 companyDescription關聯的值是任意 JavaScript object。

如果我這樣查詢我的表

select data->>'companyDescription' from companies where data is not null;

我得到這樣的行

{"ops":[{"insert":"\n"}]}

我正在嘗試更新表中的所有行,以便companyDescription值將以下列方式包裝在另一個 JSON 編碼的 JavaScript object 中:

{"type":"quill","content":{"ops":[{"insert":"\n"}]}}

這是我嘗試過的,但我認為它不起作用,因為->>運算符用於選擇一些 JSON 字段作為text ,並且確實失敗並出現語法錯誤。

update companies
set data->>'companyDescription' = CONCAT(
  '{"type":"quill","content":',
  (select data->>'companyDescription' from companies),
  '}'
);

這樣做的正確方法是什么?

您可以使用 function jsonb_set 目前XMLJSON值是不可變的。 您不能更新這些值的某些部分。 您可以用一些新的修改值替換這些值。

postgres=# select * from test;
┌──────────────────────────────────────────────────────────────────────┐
│                                  v                                   │
╞══════════════════════════════════════════════════════════════════════╡
│ {"companyId": 10, "companyDescription": {"ops": [{"insert": "\n"}]}} │
└──────────────────────────────────────────────────────────────────────┘
(1 row)

postgres=# select jsonb_build_object('type', 'quill', 'content', v->'companyDescription') from test;
┌───────────────────────────────────────────────────────────┐
│                    jsonb_build_object                     │
╞═══════════════════════════════════════════════════════════╡
│ {"type": "quill", "content": {"ops": [{"insert": "\n"}]}} │
└───────────────────────────────────────────────────────────┘
(1 row)

postgres=# select jsonb_set(v, ARRAY['companyDescription'], jsonb_build_object('type', 'quill', 'content', v->'companyDescription')) from test;
┌────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                             jsonb_set                                              │
╞════════════════════════════════════════════════════════════════════════════════════════════════════╡
│ {"companyId": 10, "companyDescription": {"type": "quill", "content": {"ops": [{"insert": "\n"}]}}} │
└────────────────────────────────────────────────────────────────────────────────────────────────────┘
(1 row)

因此,您的最終陳述可能如下所示:

update companies
  set data = jsonb_set(data::jsonb, 
                       ARRAY['companyDescription'], 
                       jsonb_build_object('type', 'quill', 
                                          'content', data->'companyDescription'))
  where data is not null;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM