postgresql 如何更新postgres表列并将值设置为和枚举类型

ebdffaop  于 2023-01-13  发布在  PostgreSQL
关注(0)|答案(1)|浏览(140)

假设我有一个包含两列的表
第一个被称为“temp_status”,它是具有值0、1、2、3、4的整数,另一个被称为“status”,它是枚举类型,具有值“Enum 1”、“Enum 2”、“Enum 3”、“Enum 4”、“Enum 5”,
我想根据“temp_status”列为“status”列赋值。我执行了以下操作,但得到了以下错误:

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
WHERE "temp_status" IN (0, 1, 2, 3, 4);

我得到了这个错误;

ERROR: column "status" is of type "MyEnumName" but expression is of type text
HINT: You will need to rewrite or cast the expression.

枚举值匹配,所以我想知道我需要如何在这里进行类型转换

xu3bshqb

xu3bshqb1#

您只是缺少了对枚举字符串的强制转换,例如。

UPDATE t
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'  -- default value
  END
WHERE temp_status IN (0, 1, 2, 3, 4);

注意:永远不会达到默认值,因为temp_status的值是对已Map到case条件(0、1、2、3、4)中的值的约束。
但是,由于您的枚举可以很容易地Map到列temp_status,因此您可以通过连接'Enum'temp_status的内容来大大简化更新:

UPDATE t 
SET status = ('Enum'||temp_status+1)::MyEnumName
WHERE "temp_status" IN (0, 1, 2, 3, 4);

演示:db<>fiddle

相关问题