json - 避免从表行构建的 JSON 中的匿名字段

标签 json postgresql field anonymous

<分区>

我有一张 table :

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_needed被替换为f1f2
我怎样才能得到一个带有字段名称本身的 JSON?文档说通过为这两个字段创建一个类型。有替代方案吗?

最佳答案

使用json_build_object()在 Postgres 9.4 或更高版本中:

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;

详细信息:

关于json - 避免从表行构建的 JSON 中的匿名字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28066171/

相关文章:

mysql - 如何在 Symfony2 中更新 mysql 数据库模式

database - awk 和字段拆分参数

Java FileWriter 不写入文件

java - 使用 Gson 将内部 ArrayList<POJO> 转换为 JSON

sql - 在更新中使用 replace() 函数来更改一列的多个子字符串

ruby-on-rails - 关于 Rails-Postgres 数据库连接的问题

json - 未使用初始化程序的结果

json - 如何在 BigQuery 中检查键的值是 ARRAY 还是 STRUCT

sql - 在postgres中仅显示表中的重复行

c++ - scanf/字段长度 : using a variable/macro, C/C++