当前查询仅使用 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)