我正在开发 PostgreSQL 13.9。我想用另一个输入数组检查 JSONB 中的数组,看看两者之间是否有元素重叠,然后在下面的示例 SQL 中返回 true
select
' {
"id1": ["5"], "id2": ["5"],
"id3": ["cc","dd" ],
"id4": "15", "id5": "11",
"id6": "2", "id7": ["12","18"]
}'::jsonb @? '$ ? ((@.id2[*] ?| ["5","7"]))'::jsonpath
我收到错误 ERROR: “|” 处或附近的语法错误的 jsonpath 输入第 7 行:}'::jsonb @? '$? ((@.id2[*] ?| ["5","7"]))'::jsonpath ^ SQL状态:42601 人物:153
当我与单个元素进行比较时,效果相同,如下所示并返回“true”
select
' {
"id1": ["9"], "id2": ["5"],
"id3": ["cc","dd" ],
"id4": "15", "id5": "11",
"id6": "2", "id7": ["12","18"]
}'::jsonb @? '$ ? ((@.id1 == "9") && (@.id2[*] == "5"))'::jsonpath
我无法确定我做错了什么。我想以一种高效的方式来做。所以不想写多个OR之类的
(@.id2[*]== "5" || @.id2[*] == 7)
任何关于我做错了什么的指示都会有很大帮助
使用此处的 jsonb_path_query 快速而肮脏的答案 JSON 函数/运算符 表 9.49。 JSON 处理函数:
select jsonb_path_query(
' {
"id1": ["5"], "id2": ["5"],
"id3": ["cc","dd" ],
"id4": "15", "id5": "11",
"id6": "2", "id7": ["12","18"]
}'::jsonb, '($.id2)') ?| array['5','7'];
?column?
----------
t
select jsonb_path_query(
' {
"id1": ["5"], "id2": ["5"],
"id3": ["cc","dd" ],
"id4": "15", "id5": "11",
"id6": "2", "id7": ["12","18"]
}'::jsonb, '($.id3)') ?| array['5','7'];
?column?
----------
f
正如已经指出的,
?|
您尝试使用exists作为普通的PostgreSQL运算符,但它不是由JSONPath的实现提供的,因此不能在这样的表达式中使用。
如果您想要与另一个对象进行比较,您可以将整个对象作为变量传递到表达式中。
jsonb
运算符不允许这样做,但 @?
允许。一旦 JSONPath 中有两个对象,它们都可以使用
jsonb_path_exists()
访问器:
[*]
select jsonb_path_exists('{"id1": ["5"], "id2": ["5"],
"id3": ["cc","dd" ],
"id4": "15", "id5": "11",
"id6": "2", "id7": ["12","18"]
}'::jsonb,
'$.id2[*]?(@==$var.id2[*])',
'{"var":{"id2":["5","7"]}}'::jsonb);
访问密钥,并直接将
->
数组与 text[]
一起使用:?|