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

PostgreSQL表枚举列更新报错:类型不匹配如何转换?

解决PostgreSQL枚举类型赋值的类型转换问题

你遇到的错误是因为PostgreSQL不会自动将text类型的字符串转换为自定义枚举类型MyEnumName,必须显式进行类型转换。以下是三种可行的解决方案:

方案1:为每个枚举值单独转换

在每个THEN后的字符串末尾添加::"MyEnumName",显式将text转换为目标枚举类型:

UPDATE "Table"
SET "status" =
CASE
    WHEN "temp_status" = 0 THEN 'Enum1'::"MyEnumName"
    WHEN "temp_status" = 1 THEN 'Enum2'::"MyEnumName"
    WHEN "temp_status" = 2 THEN 'Enum3'::"MyEnumName"
    WHEN "temp_status" = 3 THEN 'Enum4'::"MyEnumName"
    WHEN "temp_status" = 4 THEN 'Enum5'::"MyEnumName"
    ELSE 'Enum1'::"MyEnumName"  -- default value
END
WHERE "temp_status" IN (0, 1, 2, 3, 4);

方案2:为整个CASE表达式统一转换

给整个CASE表达式添加类型转换,只需写一次转换逻辑,代码更简洁:

UPDATE "Table"
SET "status" =
(CASE
    WHEN "temp_status" = 0 THEN 'Enum1'
    WHEN "temp_status" = 1 THEN 'Enum2'
    WHEN "temp_status" = 2 THEN 'Enum3'
    WHEN "temp_status" = 3 THEN 'Enum4'
    WHEN "temp_status" = 4 THEN 'Enum5'
    ELSE 'Enum1'  -- default value
END)::"MyEnumName"
WHERE "temp_status" IN (0, 1, 2, 3, 4);

方案3:使用CAST函数转换

用标准SQL的CAST()函数完成转换,效果和::运算符一致:

UPDATE "Table"
SET "status" =
CASE
    WHEN "temp_status" = 0 THEN CAST('Enum1' AS "MyEnumName")
    WHEN "temp_status" = 1 THEN CAST('Enum2' AS "MyEnumName")
    WHEN "temp_status" = 2 THEN CAST('Enum3' AS "MyEnumName")
    WHEN "temp_status" = 3 THEN CAST('Enum4' AS "MyEnumName")
    WHEN "temp_status" = 4 THEN CAST('Enum5' AS "MyEnumName")
    ELSE CAST('Enum1' AS "MyEnumName")  -- default value
END
WHERE "temp_status" IN (0, 1, 2, 3, 4);

说明

PostgreSQL的自定义枚举属于强类型,text类型无法隐式转换为枚举类型,必须通过显式转换告知数据库目标类型。三种方法任选其一即可解决问题,推荐方案2,代码更简洁易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:10:49