我有一个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"
答案 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)