PostgreSQL jsonb数组查询

问题描述 投票:0回答:0

当前查询仅使用 2 个不等于 0 的键,但我想创建一个查询,允许我说以下 20 个键都应不等于 0,而无需像这样手动输入。但是,我似乎找不到等价物(速度在这里很重要,所以最好是使用相同类型表达式的解决方案)。

这是我当前的查询:

SELECT *
FROM my_schema.my_table
where updated_at > 'now'::timestamp - '1 day'::INTERVAL
AND jsonb_column @? '$ ? (@.key1 != 0 || @.key2!= 0 )'

这就是我想要扩展它的方式。

SELECT *
FROM my_schema.my_table
where updated_at > 'now'::timestamp - '1 day'::INTERVAL
AND jsonb_column @? '$ ? (@.key1 != 0 || @.key2 != 0 || @.key3 != 0 || @.key4 != 0 || @.key5 != 0)'

但现在我希望它以更简洁的方式编写它,而不是必须手动添加例如

|| @.key6 != 0
对于每个键。

希望有人能指出我正确的方向!非常感谢!

我试过对 jsonb_each 使用 exists 子句,但这似乎慢了一倍。所以我试图对上面的内容进行更简洁明了的表示。

根据 Benji 的评论进行编辑,但这在大桌子上的执行速度是原来的两倍:

SELECT *
FROM my_schema.my_table
WHERE updated_at > 'now'::timestamp - '1 day'::INTERVAL and not EXISTS (
  SELECT 1
  FROM jsonb_each(jsonb_column) AS j(k, v)
  WHERE j.v::text = '0'
  AND j.k=ANY(ARRAY['key1', 'key2'])
)

这是我迄今为止最快的解决方案:

SELECT *
FROM my_schema.my_table
WHERE updated_at > 'now'::timestamp - '1 day'::INTERVAL and    
AND (abs((jsonb_column->>'key1')::float) > 0
    or abs((jsonb_column->>'key2')::float) > 0)
json postgresql contains jsonb
© www.soinside.com 2019 - 2024. All rights reserved.