Postgresql

Postgres多列到json

  • March 17, 2022

我正在執行 postgresql 9.3.4。我有一個包含 3 個欄位的表:

id   name  addr
---  ----  ----
1    n1    ad1
2    n2    ad2
...

我需要將數據移動到具有以下欄位的新表中:

id   data
---  ----
1    {'name': 'n1', 'addr': 'ad1'}
2    {'name': 'n2', 'addr': 'ad2'}
...

row_to_json對我來說不是解決方案,因為它也SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) t增加id了結果。有沒有辦法在我的數據欄位中選擇我需要的欄位(名稱和地址)?

我從這個連結找到了答案:

select * from (
 select id,
   (
     select row_to_json(d)
     from (
       select name, addr
       from myt d
       where d.id=s.id
     ) d
   ) as data
 from myt s
)

在Postgres 9.5或更高版本中使用運算符jsonb - text → jsonb刪除單個鍵最簡單- 在使用. (如果您不想要,請將結果轉換為。)to_jsonb()json``jsonb

SELECT id, to_jsonb(t.*) - 'id' AS data
FROM   myt t;

Postgres 10或更高版本中,您還可以使用operatorjsonb - text[] → jsonb刪除整個鍵數組。

json_build_object()Postgres 9.4或更高版本中還有一個更好的選擇:

SELECT id, json_build_object('name', name, 'addr', addr) AS data
FROM   myt;

但是自Postgres 9.3以來還有一種更簡單的方法:

SELECT id, to_json((SELECT d FROM (SELECT name, addr) d)) AS data
FROM   myt;

to_json()大多與row_to_json().

在小提琴中找到更多的語法變體。

db<>fiddle here

sqlfiddle (Postgres 9.6)

相關答案:

引用自:https://dba.stackexchange.com/questions/90858