2016-09-14 72 views
3

如果我有一个jsonb柱领域,如所谓的value查询JSONB与数组字段

{"id": "5e367554-bf4e-4057-8089-a3a43c9470c0", 
"tags": ["principal", "reversal", "interest"],,, etc} 

我如何才能找到包含给定的标签,例如所有记录: 如果给:["reversal", "interest"] 它应该找到所有具有“逆转”或“利息”或两者的记录。

我的实验让我这个令人厌恶的东西远:

select value from account_balance_updated 
where value @> '{}' :: jsonb and value->>'tags' LIKE '%"principal"%'; 

当然,这是完全错误的,低效的

回答

1

事实证明,你可以使用这里描述的酷jsonb运营商:

https://www.postgresql.org/docs/9.5/static/functions-json.html

所以原始查询没有太大变化:

select value from account_balance_updated 
where value @> '{}' :: jsonb and value->'tags' ?| array['reversal', 'interest']; 

在我的情况我还需要躲避???|),因为我使用所谓的“准备好的声明中”在那里你通过查询字符串和参数,JDBC和问号就像占位PARAMS:

https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

1

假设你正在使用PG 9.4+,您可以使用jsonb_array_elements()功能:

SELECT DISTINCT abu.* 
FROM account_balance_updated abu, 
    jsonb_array_elements(abu.value->'tags') t 
WHERE t.value <@ '["reversal", "interest"]'::jsonb; 
+0

这个工作,非常感谢! – Agzam

+0

呃......现在我想知道是否可以通过修改'where'部分来实现这个目标?否则,我将不得不重构代码的其他部分(构成整个查询)。因此,如果我的查询开始时间是'select account from account_balance_updated where value @>'{}':: jsonb and value - >>'id'='48c017c2-40c0-4462-ba2b-c2f176a2d086'并且... '我可以通过追加一些魔法来像这样查询来达到同样的诀窍(就像在你的答案中一样)? – Agzam

+0

我做了这个'和价值 - >'标签'? array ['interest','reversal']'并且它似乎在工作 – Agzam