2016-02-11 54 views
0

我們的數據庫有一個表「日誌」像這樣的嵌套值:檢索和PostgreSQL JSON列

id | purchases (json) 
1 {"apple":{"price":5,"seller":"frank"}, "bred":{"price":3,"seller":"kathy"}} 
2 {"milk":{"price":3,"seller":"anne"}, "banana":{"price":2,"seller":"frank"}} 
3 {"bred":{"price":4,"seller":"kathy"}} 

我們想檢索包含"seller":"kathy"所有記錄。我們試圖簡單的查詢是這樣的:

SELECT id FROM log WHERE purchases ->> 'seller' LIKE 'kathy' 
SELECT id FROM log WHERE purchases = '{"seller":"kathy"}' 

研究,我們這裏和其他地方好幾個小時......這似乎有點更加複雜,因爲這些值是嵌套?我們發現例如一些java或pgplsql實現,但我們仍然希望有一種「純SQL」的方式。什麼是合適的解決方案?或者我們應該重新組織我們的內容是這樣的:

id | purchases (json) 
1 [{"product":"apple","price":5,"seller":"frank"},{"product":"bred","price":3,"seller":"kathy"}] 
2 [{"product":"milk","price":3,"seller":"anne"},{"product":"banana","price":2,"seller":"frank"}] 
3 [{"product":"bred","price":4,"seller":"kathy"}] 

但我們發現,這將是更爲複雜,因爲我們必須在查詢中爆炸的陣列。任何簡短提示?謝謝!

回答

1

檢查json_each()#>>Postgres JSON functions

WITH log(id,purchases) AS (VALUES 
    (1,'{"apple":{"price":5,"seller":"frank"}, "bred":{"price":3,"seller":"kathy"}}'::JSON), 
    (2,'{"milk":{"price":3,"seller":"anne"}, "banana":{"price":2,"seller":"frank"}}'::JSON), 
    (3,'{"bred":{"price":4,"seller":"kathy"}}'::JSON) 
) 
SELECT log.* FROM log, 
    json_each(log.purchases) as purchase 
WHERE 
    purchase.value#>>'{seller}' = 'kathy'; 

結果:

id |         purchases         
----+----------------------------------------------------------------------------- 
    1 | {"apple":{"price":5,"seller":"frank"}, "bred":{"price":3,"seller":"kathy"}} 
    3 | {"bred":{"price":4,"seller":"kathy"}} 
(2 rows) 
+0

完善,有很大幫助,感謝@dmitry,我明白得多了。 – Rainer