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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:48:18