我正在使用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
字符串
我得到错误错误:语法错误在或附近“|“的jsonpath输入行7:<$'::jsonb @?'$?((@.id2[*]?|[“5”,“7”])'::jsonpath ^ SQL state:42601 Character: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)
型
任何关于我做错了什么的指示都将有很大的帮助
3条答案
按热度按时间mnowg1ta1#
使用jsonb_path_query快速而粗略的回答JSON functions/operators * 表9. 49. JSON处理函数 *:
字符串
gijlo24d2#
如前所述,
?|
作为普通的PostgreSQL操作符存在,但JSONPath的实现没有提供它,因此不能在这样的表达式中使用。此外,您不能在表达式中使用数组或对象文字,因此["5","7"]
也不能在那里使用。如果你有一个
jsonb
对象,你想和另一个对象进行比较,你可以把整个对象作为一个变量传递到表达式中。@?
操作符不允许这样做,但是jsonb_path_exists()
可以。一旦你在JSONPath中有了两个对象,它们都可以使用[*]
访问器:字符串
| jsonb_path_exists|
| --|
| 不|
或者你可以把它添加到:
型
| jsonb_path_exists|
| --|
| 不|
或者你可以使用常规的
->
访问密钥,并直接将text[]
数组与?|
一起使用:型
| ?列?|
| --|
| 不|
Demo at db<>fiddle
xlpyo6sf3#
那又怎样:
字符串