You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中jsonb_path_exists能否用JSONPath检查值是否在列表中?

PostgreSQL JSONPath 多值匹配解决方案

PostgreSQL的JSONPath语法不支持IN运算符,你尝试的两种写法都会触发语法错误,以下是几种可靠的替代实现方式:

方式1:逻辑或拼接多条件

直接用JSONPath的逻辑或(||)连接多个相等判断,适合值数量较少的场景:

SELECT t.id
FROM some_scheme.some_table as t
WHERE jsonb_path_exists(t.jsonb_field, '$[*] ? (@.id == "0e66fef9-0f59-4741-9669-74f41fc26a3f" || @.id == "1e66fef9-0f59-4741-9669-74f41fc26a3f")');

方式2:JSONPath参数绑定(动态值友好)

通过jsonb_path_exists的第三个参数传入值数组,用变量匹配,适合值列表需要动态生成的场景:

SELECT t.id
FROM some_scheme.some_table as t
WHERE jsonb_path_exists(
  t.jsonb_field,
  '$[*] ? (@.id == $vals)',
  '{"vals": ["0e66fef9-0f59-4741-9669-74f41fc26a3f", "1e66fef9-0f59-4741-9669-74f41fc26a3f"]}'::jsonb
);

如果用应用程序调用,可以动态构造第三个参数的JSONB值,无需拼接SQL字符串。

方式3:展开JSONB数组后匹配(非JSONPath写法)

如果不需要局限于JSONPath语法,可将数组展开为行后用ANY判断,性能在大数组场景下可能更优:

SELECT DISTINCT t.id
FROM some_scheme.some_table as t
CROSS JOIN jsonb_array_elements(t.jsonb_field) AS elem
WHERE elem->>'id' = ANY(ARRAY[
  '0e66fef9-0f59-4741-9669-74f41fc26a3f',
  '1e66fef9-0f59-4741-9669-74f41fc26a3f'
]);

添加DISTINCT是为了避免同一行因为数组内多个匹配项被重复返回。

内容的提问来源于stack exchange,提问作者Rodderh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:02:41