2015-01-21 22 views
1

我有一個表:避免JSON匿名領域從表中的行建

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?文檔通過爲這兩個字段創建一個類型來說明。有其他選擇嗎?

+1

您的Postgres版本對於這個問題至關重要。 – 2015-01-21 13:34:27

回答

0

在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; 

詳情:

+0

我正在使用Postgres 9.3 – Thara 2015-01-21 17:43:41

+0

爲9.3添加了一個解決方案。請務必按照鏈接進行詳細說明。 – 2015-01-21 17:49:34

+0

非常感謝。這是我所尋找的。將確切地通過細節鏈接。 – Thara 2015-01-22 05:36:58