Postgres 使用另一个数组检查 JSONB 列中任何数组元素是否存在

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

我正在开发 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)

任何关于我做错了什么的指示都会有很大帮助

sql postgresql jsonb
2个回答
0
投票

使用此处的 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



0
投票

正如已经指出的,

?|
您尝试使用exists作为普通的PostgreSQL运算符,但它不是由JSONPath的实现提供的,因此不能在这样的表达式中使用。

如果您想要与另一个对象进行比较,您可以将整个对象作为变量传递到表达式中。

jsonb
运算符不允许这样做,但
@?
 允许。一旦 JSONPath 中有两个对象,它们都可以使用 
jsonb_path_exists() 访问器
:
[*]


jsonb_path_存在t
或者您可以使用常规
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[]
一起使用:
?|


?栏?t
db<>fiddle 的演示

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