PostgreSQL中如何用单个JSONPath提取多路径JSON值?
解决方案
可以利用PostgreSQL JSONPath的**并集操作符||**来合并多个目标路径,配合ERROR ON ERROR约束实现自动校验仅返回单个匹配值,无需使用COALESCE。
核心SQL示例
WITH test_data AS ( SELECT '{"a": 1, "b": 2, "c": 3}'::jsonb AS j UNION ALL SELECT '{"a": 1, "b": 2, "d": 4}'::jsonb AS j ) SELECT j AS original_json, extracted_value FROM test_data, JSON_TABLE( j, '$.c || $.d' -- 合并c和d两个路径的并集 COLUMNS ( extracted_value INT PATH '$' ERROR ON ERROR -- 自动校验仅返回单个值,多匹配则报错 ) ) AS t;
效果说明
- 对于仅含
c或仅含d的JSON,会正确提取对应的值(3或4)。 - 如果JSON同时包含
c和d(如{"a":1,"b":2,"c":3,"d":4}),ERROR ON ERROR会触发报错,自动完成“仅存在一个目标字段”的校验,无需手动检查。 - 该方法直接通过单个JSONPath表达式实现多路径匹配,避免了
COALESCE带来的额外转换步骤。
替代写法(遍历过滤键名)
如果需要匹配的键名较多,也可以通过遍历对象属性并过滤键名的方式实现:
WITH test_data AS ( SELECT '{"a": 1, "b": 2, "c": 3}'::jsonb AS j UNION ALL SELECT '{"a": 1, "b": 2, "d": 4}'::jsonb AS j ) SELECT j AS original_json, extracted_value FROM test_data, JSON_TABLE( j, '$.* ? (key() == "c" || key() == "d")' -- 遍历所有属性,过滤键名为c或d的项 COLUMNS ( extracted_value INT PATH '$' ERROR ON ERROR ) ) AS t;
这种写法适合目标键名数量较多的场景,只需修改过滤条件中的键名列表即可。
内容的提问来源于stack exchange,提问作者Basil Peace
相关产品推荐
相关产品推荐

