2016-10-09 142 views
3

我有這些表上畝的PostgreSQL 9.05:如何獲取json對象作爲postgresql中的列?

表:core 字段:namedescriptiondata

data字段是一個JSON字段,與(例如):{"id": "100", "tax": "4,5"}

始終是每個數據爲one json。

我的問題是:我可以獲取所有的JSON字段作爲查詢字段嗎?返回像這樣:name, description, id, tax....

問題是:我的JSON確實有各種領域,可以是Id,稅或其他。

+1

參見[Postgres的:從JSONB字段拼合聚合鍵/值對(http://stackoverflow.com/a/ 35179515/1995738) – klin

回答

5

你不能那樣做「動態」。你需要指定你想要的列:

select name, description, id, 
     data ->> 'tax' as tax, 
     data ->> 'other_attribute' as other_attribute 
from core; 

如果你做了很多,你可能想把它放到一個視圖中。


另一種選擇是在Postgres中創建一個代表JSON屬性的對象類型,例如,

create type core_type as (id integer, tax numeric, price numeric, code varchar); 

你可以再投的JSON到類型,並從JSON相應的屬性將自動轉換爲列:

通過上述類型和下面的JSON:{"id": "100", "tax": "4.5", "price": "10", "code": "YXCV"}你可以這樣做:

select id, (json_populate_record(null::core_object, data)).* 
from core; 

,它將返回:

id | tax | price | code 
---+------+-------+----- 
1 | 4.50 | 10 | YXCV 

但您需要確保將每個JSON值都可以轉換爲相應對象字段的類型

如果更改對象類型,則使用它的任何查詢都會自動更新。所以你可以通過一箇中心定義來管理你感興趣的列。

+0

謝謝,但我不知道所有的列可以在json裏面,可以是1或2 ..或者10 ...我可以做到這一點,動態嗎? –

+0

@fh_bash:正如我所說:你不能「動態地」這樣做。在SQL中,必須在查詢運行時定義查詢的列數,並且結果的所有行必須具有相同數量的列。 –

0

從PostgreSQL 9.4開始,你也可以使用json_to_record

從JSON對象構建任意記錄(請參見下面的註釋)。與所有返回記錄的函數一樣,調用者必須使用AS子句明確定義記錄的結構。

例如:

select * from json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}') as x(a int, b text, d text) 

返回

a | b | d 
---+---------+--- 
1 | [1,2,3] |