postgresql 更正数组中包含的jsonb_path的查询

axzmvihb  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(171)

表格

CREATE TABLE users
(
    username   VARCHAR(128) PRIMARY KEY,
    info       JSONB
);
INSERT INTO users (username, info)
VALUES 
('Lana', '[
  {
    "id": "first"
  },
  {
    "id": "second"
  }
]'),
('Andy', '[
  {
     "id": "first"
  },
  {
      "id": "third"
  }
 ]');

所以我想找到所有的用户,他们的info.id包含在类似[“first”]的数组中。
请求应类似于:

SELECT * 
FROM users 
where jsonb_path_exists(info, '$.id ? (@ in ("first", "second", "third",...) )');

但我找不到正确的实现

7cwmlq89

7cwmlq891#

您需要使用$[*]迭代数组元素,然后使用==

SELECT * 
FROM users 
where jsonb_path_exists(info, '$[*] ? (@.id == "first" || @.id == "second" || @.id == "third")');

或者收集所有ID并使用?|运算符:

SELECT * 
FROM users 
where jsonb_path_query_array(info, '$[*].id') ?|  array['first','second','third');

这将返回包含 * 至少 * 其中一个值的行。
如果需要查找包含所有值的行,请改用?&

ep6jt1vc

ep6jt1vc2#

在SQL/JSON路径语言中没有IN运算符。如果你想从众多的选择中找到一个,请使用正则表达式,例如:

select * 
from users 
where jsonb_path_exists(info, '$.id ? (@ like_regex "^(second|third)$" )');

相关问题