2016-04-20 53 views
1

我有存儲在JSONB場在我的PostgreSQL 9.5 DB JSON數據。清潔的方式來查詢複雜的JSON在PostgreSQL

有沒有辦法在不知道哪一列是子對象的情況下製作子對象列?

JSON例子問題:

{ 
    "a":1, 
    "b":[1,2,3], 
    "c":"bar", 
    "d":{ 
     "key1":"value1", 
     "key2":"value2" 
    } 
} 

我可以使用以下方法來獲取所有的鍵從一個JSON對象。

SELECT * FROM json_object_keys('{"a":1,"b":[1,2,3],"c":"bar", "d":{"key1":"value1", "key2":"value2"}}')

在這一點上,我可以再使用json_to_record(),但我想列打出自己獨立的領域。

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

讓我

a| b  | c | d  
1| [1,2,3] | bar | {"key1":"value1", "key2":"value2"} 

有沒有辦法讓這樣的事情回來,最好是在一個單一的查詢?

-------------------------------------------------------------------- 
a| b  | c | d         | key1 | key2  
1| [1,2,3] | bar | {"key1":"value1", "key2":"value2"} |value1 |value2 

回答

1
WITH t(v) AS (VALUES 
    ('{ 
    "a":1, 
    "b":[1,2,3], 
    "c":"bar", 
    "d":{ 
     "key1":"value1", 
     "key2":"value2" 
    } 
    }'::JSONB) 
) 
SELECT x1.*,x2.* FROM t, 
    jsonb_to_record(v) as x1(a int,b text,c text,d jsonb), 
    jsonb_to_record(v->'d') as x2(key1 text,key2 text); 

結果:

a |  b  | c |     d     | key1 | key2 
---+-----------+-----+--------------------------------------+--------+-------- 
1 | [1, 2, 3] | bar | {"key1": "value1", "key2": "value2"} | value1 | value2 
(1 row) 
+0

謝謝!那讓我95%。如果您不明確知道D是另一個JSON對象,是否有任何方法可以爲該級別上的所有對象生成jsonb_to_record(v - >'d')?我發現了一個獲取類型的json_typeof()表函數。從另一個查詢生成SQL是否是一種不好的做法?挑戰來源於提取構建Microsoft Word文檔的表格內容。我們不知道每個表有多少列,我們不知道列的名稱。從表到表都沒有任何列標題名稱或列之間的列數一致。 –