查询记录jsonb字段的值全部为零

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

我有一个带有如下 JSONB 字段的表:

{'a': '0', 'b': '0'}

我想要记录所有值都是字符串零(“0”)。 键的数量和名称不固定,并且在记录之间有所不同。我已经尝试过了,但它不起作用

SELECT * FROM mytabel WHERE NOT jsonb_exists("myfield", '$$ WHERE value != \'0\' $$');

这个查询也按预期工作,但它需要内部联接,我想知道我们是否可以避免这种情况。

SELECT *
FROM mytabel WHERE 
NOT EXISTS (
    SELECT 1
    FROM jsonb_each_text(myfield) AS kv
    WHERE kv.value <> '0'
);
postgresql jsonb
1个回答
0
投票

您可以使用

@@
JSONPath 谓词检查运算符:

jsonb @@ jsonpath → boolean

返回指定 JSON 值的 JSON 路径谓词检查的结果。仅考虑结果的第一项。如果结果不是布尔值,则返回 NULL。
'{"a":[1,2,3,4,5]}'::jsonb @@ '$.a[*] > 2' → t

db<>fiddle 的演示:

SELECT *
FROM mytabel WHERE not myfield @@ '$.* <> "0" || $.*.type()<>"string"';
我的领域
{“a”:“0”,“b”:“0”}

在您的示例中,您尝试使用

jsonb_exists()
,这是
?
运算符背后的函数
:

jsonb ? text → boolean

文本字符串是否作为 JSON 值中的顶级键或数组元素存在?
'{"a":1, "b":2}'::jsonb ? 'b' → t

您使用该函数会导致搜索键

"$$ WHERE value != \'0\' $$'"
的存在 - 该文本不能作为任何类型的
WHERE
子句。

© www.soinside.com 2019 - 2024. All rights reserved.