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

评论

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

#1 楼

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

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


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

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


db <>在这里拨弄
Postgres 9.6上的旧SQL拨弄。

相关答案:


选择json_agg中的列
以SQL中的JSON对象数组的形式返回(Postgres)
返回总行数和所选(汇总)数据


评论


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

– MIguelele
18年8月20日在15:15

#2 楼

我从此链接找到了答案:

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érace
2015年2月2日在23:02

除了外部查询中缺少表别名外,这比所需的更为复杂和昂贵。我用小提琴添加了另一个答案来演示。

–欧文·布兰德斯特(Erwin Brandstetter)
2015年2月3日,下午3:31