2016-02-11 57 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