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

如何拆分PostgreSQL jsonb列单行数据生成与物理表一致的多行查询结果

调整后查询语句

SELECT
  row_number() OVER () AS "LOS",
  t."SpeedLessThan",
  t."SpeedAtLeast"
FROM "ProjectMqs"
CROSS JOIN LATERAL unnest(
  -- 三个等级对应的SpeedLessThan值,最后一行用1000覆盖所有>999的场景
  ARRAY[
    ("LevelOfServiceConfig"->>'Danger')::numeric,
    ("LevelOfServiceConfig"->>'TrafficJam')::numeric,
    1000
  ],
  -- 三个等级对应的SpeedAtLeast值,第一行用0过滤<0的场景
  ARRAY[
    0,
    ("LevelOfServiceConfig"->>'Danger')::numeric,
    ("LevelOfServiceConfig"->>'TrafficJam')::numeric
  ]
) AS t("SpeedLessThan", "SpeedAtLeast")
WHERE "ProjectId" = 500
  AND NULLIF(regexp_replace("Name", '\D','','g'), '')::numeric = 1;

逻辑说明

  • 通过CROSS JOIN LATERAL + unnest的组合,将单行jsonb中的阈值和手动补充的边界值拼接为3组区间数值,拆分为3行输出
  • 输出的三个区间依次为:0 ≤ 速度 < Danger阈值、Danger阈值 ≤ 速度 < TrafficJam阈值、TrafficJam阈值 ≤ 速度 < 1000,刚好满足小于0的数值不命中任何区间、大于等于999的数值全部命中最后一行的要求
  • row_number() OVER ()生成连续自增的LOS序号,输出字段与原物理表查询完全一致
  • 如果JSON中存储的阈值字段名、等级优先级和示例不符,直接调整unnest两个数组内的取值顺序即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:15:09