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
相关产品推荐
相关产品推荐

