如果我的jsonb
列名为value
,其字段如下:
{"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"%';
当然这是完全错误和低效的
答案 0 :(得分: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;
答案 1 :(得分: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