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
相关产品推荐
相关产品推荐

