2014-01-08 45 views
0

鑑於N個記錄包含一個JSON列Postgres的JSON鍵數

|ID |Name |JSON        
|01 |TEST1 |{"key1" : "value1", "key2": "value2", "key4": "value4"} 
|02 |TEST1 |{"key1" : "value1"} 
|03 |TEST2 |{"key1" : "value1", "key2": "value2", "key3":"value3"} 
... 

什麼是計算每個JSON值的出現了一組鍵,這樣是最好的策略,對於上述我會的例子限制爲key1,key2,key3並獲得: -

|value1|value2|value3| 
|3  |2  |1  | 

值會改變,所以我不想明確地查找它們。

+0

在我之後重複:*我不應該使用json或hstore或xml或eav或任何其他半結構化構造,如果我真的關心存儲在其中的任何* *。重複:**不使用**。 (提示:修正你的模式,同時查看json函數。) –

回答

2
CREATE TABLE test (id INT4 PRIMARY KEY, some_name TEXT, j json); 
copy test FROM stdin; 
01 TEST1 {"key1" : "value1", "key2": "value2", "key4": "value4"} 
02 TEST1 {"key1" : "value1"} 
03 TEST2 {"key1" : "value1", "key2": "value2", "key3":"value3"} 
\. 
with unpacked as (
    SELECT (json_each_text(j)).* FROM test 
) 
SELECT value, count(*) FROM unpacked WHERE key in ('key1', 'key2', 'key3') group by value; 

返回:

value | count 
--------+------- 
value1 |  3 
value3 |  1 
value2 |  2 
(3 rows) 

返回像你表現出不打我的偉大的想法(你想怎麼做,如果有4個十億不同的值?),但你總能在您的應用程序中透視,或修改查詢以執行透視。