我有一个表users
,其jsonb
字段名为data
。我必须检索匹配给定字符串的data
列中具有值的所有用户。例如:
user1 = data: {"property_a": "a1", "property_b": "b1"}
user2 = data: {"property_a": "a2", "property_b": "b2"}
我想要检索任何值data
匹配'b2'
的用户,在这种情况下将是'user2'
。
知道如何以优雅的方式做到这一点吗?我可以从所有用户的data
中检索所有密钥并手动创建查询,但这既不快也不优雅。
此外,我必须先检索匹配的键和值,但首先要检索。
答案 0 :(得分:4)
没有简单的方法。 Per documentation:
GIN索引可用于有效搜索键或键/值 在大量jsonb文档(基准)中发生的对
大胆强调我的。所有值都没有索引。 (那些可能具有不兼容的数据类型!)如果您不知道所有密钥的名称,则必须检查每一行中的所有JSON值。
如果只有两个像你演示的键(或只是一些好的键),它仍然很容易:
SELECT *
FROM users
WHERE data->>'property_a' = 'b2' OR
data->>'property_b' = 'b2';
可以使用简单的expression index:
支持CREATE INDEX foo_idx ON users ((data->>'property_a'), (data->>'property_b'))
带有GIN索引的或:
SELECT *
FROM v
WHERE data @> '{"property_a": "b2"}' OR
data @> '{"property_b": "b2"}'
CREATE INDEX bar_idx ON users USING gin (data jsonb_path_ops);
如果您不知道所有关键名称,事情会变得复杂......
相关:
答案 1 :(得分:2)
尝试此查询。
SELECT * FROM users
WHERE data::text LIKE '%b2%'
当然,如果你的密钥也包含这样的字符串,它将无效。