如何在postgres中过滤json的任何键的值

时间:2015-04-13 15:25:18

标签: sql json postgresql jsonb

我有一个表users,其jsonb字段名为data。我必须检索匹配给定字符串的data列中具有的所有用户。例如:

user1 = data: {"property_a": "a1", "property_b": "b1"}
user2 = data: {"property_a": "a2", "property_b": "b2"}

我想要检索任何值data匹配'b2'的用户,在这种情况下将是'user2'

知道如何以优雅的方式做到这一点吗?我可以从所有用户的data中检索所有密钥并手动创建查询,但这既不快也不优雅。

此外,我必须先检索匹配的键和值,但首先要检索。

2 个答案:

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

当然,如果你的密钥也包含这样的字符串,它将无效。