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

cngwdvgl  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(3)|浏览(145)

我正在使用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)


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

mnowg1ta

mnowg1ta1#

使用jsonb_path_query快速而粗略的回答JSON functions/operators * 表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

字符串

gijlo24d

gijlo24d2#

如前所述,?|作为普通的PostgreSQL操作符存在,但JSONPath的实现没有提供它,因此不能在这样的表达式中使用。此外,您不能在表达式中使用数组或对象文字,因此["5","7"]也不能在那里使用。
如果你有一个jsonb对象,你想和另一个对象进行比较,你可以把整个对象作为一个变量传递到表达式中。@?操作符不允许这样做,但是jsonb_path_exists()可以。一旦你在JSONPath中有了两个对象,它们都可以使用[*]访问器:

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);

字符串
| jsonb_path_exists|
| --|
| 不|
或者你可以把它添加到:

select jsonb_path_exists('{"id1": ["5"],  "id2": ["5"],
                           "id3": ["cc","dd" ],
                           "id4": "15",   "id5": "11",
                           "id6": "2",  "id7": ["12","18"]
                          }'::jsonb||'{"var":{"id2":["5","7"]}}'::jsonb,
                         '$.id2[*]?(@==$.var.id2[*])');


| jsonb_path_exists|
| --|
| 不|
或者你可以使用常规的->访问密钥,并直接将text[]数组与?|一起使用:

select 
  '  {
  "id1": ["5"],  "id2": ["5"],
  "id3": ["cc","dd" ],
  "id4": "15",   "id5": "11",
  "id6": "2",  "id7": ["12","18"]
}'::jsonb->'id2' ?| '{5,7}'


| ?列?|
| --|
| 不|
Demo at db<>fiddle

xlpyo6sf

xlpyo6sf3#

那又怎样:

select exists (
  select from jsonb_array_elements('[1, 2, 3]'::jsonb)
  where value::int = any(array[1, 4])
);

字符串

相关问题