【问题标题】:Avoid anonymous fields in JSON built from table rows [duplicate]避免从表行构建的 JSON 中的匿名字段 [重复]
【发布时间】:2015-01-21 11:31:38
【问题描述】:

我有一张桌子:

CREATE TABLE test (
  item_id INTEGER NOT NULL,
  item_name VARCHAR(255) NOT NULL,
  mal_item_name VARCHAR(255),
  active CHAR(1) NOT NULL,
  data_needed CHAR(1) NOT NULL,
  parent_id INTEGER);

查询:

select array_to_json(array_agg(row_to_json(t))) 
from (select item_id as id, 
             item_name as text, 
             parent_id as parent,
             (mal_item_name,data_needed) as data 
      from test) t

产生结果:

[{"id":1,"text":"Materials","parent":0, "data": {"f1":null,"f2":"N"}},
 {"id":2,"text":"Bricks","parent":1, "data":{"f1":null,"f2":"N"}},
 {"id":3,"text":"Class(high)","parent":2, "data":{"f1":null,"f2":"Y"}},
 {"id":4,"text":"Class(low)","parent":2, "data":{"f1":null,"f2":"Y"}}]

原来的字段名称mal_item_namedata_neededf1f2替换。
如何获取带有字段名本身的 JSON?文档说通过为这两个字段创建一个类型。有其他选择吗?

【问题讨论】:

  • 你的 Postgres 版本对这个问题很重要。

标签: json postgresql field anonymous


【解决方案1】:

在 Postgres 9.4 中,您可以使用 json_build_object() 解决此问题:

SELECT json_agg(t) AS js
FROM  (SELECT item_id   AS id
            , item_name AS text
            , parent_id AS parent
            , json_build_object('mal_item_name', mal_item_name
                               ,'data_needed', data_needed) AS data
       FROM test) t;

并使用json_agg(...) 而不是array_to_json(array_agg(row_to_json(...)))

对于 Postgres 9.3

SELECT json_agg(t) AS js
FROM  (SELECT item_id   AS id
            , item_name AS text
            , parent_id AS parent
            , (SELECT t FROM (SELECT mal_item_name, data_needed) 
                                AS t(mal_item_name, data_needed)) AS data
       FROM test) t;

详情:

【讨论】:

  • 我使用的是 Postgres 9.3
  • 添加了 9.3 的解决方案。请务必点击链接获取详细说明。
  • 非常感谢。这就是我所寻找的。肯定会通过详细信息链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多