使用数组字段查询JSONB

时间:2016-09-14 00:33:46

标签: postgresql jsonb

如果我的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"%';

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

2 个答案:

答案 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