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

PostgreSQL 10升级报错:CASE中不允许使用集合返回函数

问题解决方案

问题原因

PostgreSQL 10及后续版本严格规范了集合返回函数(比如jsonb_array_elements_text)的使用场景,禁止在CASE表达式这类期望返回单一值的结构中调用它们。而PostgreSQL 9.6的宽松处理允许这种非标准用法,会隐式将函数返回的多个元素拆分为单独行,升级后这种行为被修复,因此触发报错。

修复方案

方案1:使用LATERAL JOIN(推荐)

这种方式能准确复现9.6版本的输出结果,同时符合新版本的语法规范:

SELECT 
    COALESCE(concat('RR', elem), '') AS concat
FROM workflow.workflow_log_history wlh
LEFT JOIN LATERAL (
    -- 仅处理匹配%DR%的行,展开JSON数组元素
    SELECT jsonb_array_elements_text(replace(wlh.status_reason_code, 'DR', '')::jsonb) AS elem
    WHERE wlh.status_reason_code LIKE '%DR%'
) sub ON true;
  • LEFT JOIN LATERAL确保所有行都能被返回,不管是否匹配%DR%
  • 匹配的行通过子查询展开数组元素,每一个元素生成一行
  • COALESCE将不匹配行的NULL替换为空字符串,和原逻辑一致

方案2:用UNION ALL分情况处理

如果更习惯分条件写逻辑,可以用UNION ALL拆分两种场景:

-- 处理匹配%DR%的行,展开数组并拼接前缀
SELECT concat('RR', jsonb_array_elements_text(replace(wlh.status_reason_code, 'DR', '')::jsonb)) AS concat
FROM workflow.workflow_log_history wlh
WHERE wlh.status_reason_code LIKE '%DR%'

UNION ALL

-- 处理不匹配的行,返回空字符串
SELECT '' AS concat
FROM workflow.workflow_log_history wlh
WHERE wlh.status_reason_code NOT LIKE '%DR%';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:48:23