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

PostgreSQL 11中CASE语句枚举转字符串报错问题求助

PostgreSQL CASE表达式更新枚举列报错原因及解决方法

报错原因

第一种CASE写法中,两个分支返回的都是字符串字面量('ABANDONED'、'COMPLETED'),PostgreSQL会自动将整个CASE表达式的结果类型推导为text。但目标列state是自定义枚举类型PushState,PostgreSQL默认不会隐式将text类型转换为枚举类型,因此触发类型不匹配的报错。

第二种写法能正常执行的核心原因:

  • 当else分支使用"state"时,该分支的类型是PushState,PostgreSQL会将整个CASE表达式的结果类型推导为PushState,此时THEN分支的字符串字面量会被隐式转换为对应的枚举值(只要字符串是枚举的有效值)。
  • 多分支CASE写法中,else分支的"state"是枚举类型,同样让整个CASE表达式的类型变为PushState,前两个分支的字符串字面量会被隐式转换。加上WHERE条件限制了id范围,else分支实际不会执行,但类型推导仍会考虑所有分支的类型。

第一种写法的修复方案

只需显式将字符串字面量转换为PushState枚举类型,有两种常用方式:

方式一:使用类型转换操作符 ::

UPDATE "Push"
SET "state" = CASE id WHEN 46 THEN 'ABANDONED'::PushState else 'COMPLETED'::PushState END
WHERE id in (46,47)

方式二:使用 CAST 函数

UPDATE "Push"
SET "state" = CASE id WHEN 46 THEN CAST('ABANDONED' AS PushState) else CAST('COMPLETED' AS PushState) END
WHERE id in (46,47)

这样CASE表达式的结果类型就与目标列state的类型匹配,能够正常执行更新操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:25:12