如果已经存在不匹配的值,如何将列更改为Postgres中的用户定义类型?

时间:2017-11-15 15:04:40

标签: postgresql

我有一个Postgres表,其中一列当前的类型为“character varying(50)”。我想将该列的类型更改为用户定义的类型,以将允许值限制为在我的用户定义类型“fruit_types”中指定的值。

有没有办法可以使用ALTER COLUMN语句基本上说“将此列中的现有值转换为预定义的fruit_types之一,如果无法转换,请设置为其他 “?

这是我的用户定义类型:

CREATE TYPE food.fruit_types AS ENUM
    ('apple', 'banana', 'peach', 'other');

只要所有文本都与我的用户定义类型中的值匹配,这里的语句就会起作用:

ALTER TABLE food.fruit
  ALTER COLUMN fruit_type TYPE food.fruit_types USING 
   (fruit_type::TEXT::food.fruit_types);

但是如果我在该列中有一个不在用户定义类型中的值(例如“kiwi”),那么我收到此错误消息:

invalid input value for enum food.fruit_types: "kiwi"

1 个答案:

答案 0 :(得分:3)

您可以使用the function enum_range():

检查枚举类型中是否存在标签
ALTER TABLE food.fruit
    ALTER COLUMN fruit_type TYPE food.fruit_types USING (
        CASE 
            WHEN fruit_type = ANY(enum_range(NULL::food.fruit_types)::text[]) 
            THEN fruit_type::food.fruit_types
            ELSE 'other'::food.fruit_types
        END)