我有一个带有如下 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'
);
您可以使用
@@
JSONPath 谓词检查运算符:
jsonb @@ jsonpath → boolean
返回指定 JSON 值的 JSON 路径谓词检查的结果。仅考虑结果的第一项。如果结果不是布尔值,则返回 NULL。
'{"a":[1,2,3,4,5]}'::jsonb @@ '$.a[*] > 2' → t
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
子句。