Postgres多列到JSON


23

我正在运行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结果。有没有办法在我的数据字段中选择我需要的字段(名称和地址)?


我不确定答案是否正确。我两年前问过。那时我也回答了我的问题,但没有将其标记为正确。
AliBZ

Answers:


52

json_build_object()Postgres 9.4+中有一个更好的选择:

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

但是row_to_json()Postgres 9.3中还有一种更简单,更快捷的方法:

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

db <> fiddle here Postgres 9.6上的
SQL Fiddle

相关答案:


这是一个更好的答案,小提琴有证据。
MIguelele

5

我从此链接找到了答案:

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
)

不要忘了将您自己的答案标记为正确的(尽管没有要点:-()。我认为您不能立即做到这一点,但是将来可能会对有类似问题的人有所帮助。)
Vérace15年

2
除了外部查询中缺少表别名之外,这也比所需的更为复杂和昂贵。我用小提琴添加了另一个答案来演示。
Erwin Brandstetter,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.