将Postgres列从整数类型更改为布尔类型

63

我有一个字段,其类型为INTEGER NOT NULL DEFAULT 0,现在需要将其更改为bool类型。

这是我正在使用的代码:

ALTER TABLE mytabe 
ALTER mycolumn TYPE bool 
USING 
    CASE 
        WHEN 0 THEN FALSE 
        ELSE TRUE 
    END;
但是我得到了:
ERROR:  argument of CASE/WHEN must be type boolean, not type integer

********** Error **********

ERROR: argument of CASE/WHEN must be type boolean, not type integer
SQL state: 42804
任何想法吗? 谢谢。
3个回答

125

试试这个:

ALTER TABLE mytabe ALTER COLUMN mycolumn DROP DEFAULT;
ALTER TABLE mytabe ALTER mycolumn TYPE bool USING CASE WHEN mycolumn=0 THEN FALSE ELSE TRUE END;
ALTER TABLE mytabe ALTER COLUMN mycolumn SET DEFAULT FALSE;
你需要先删除约束(因为它不是布尔值),其次你的 CASE 语句在语法上有误。

16
Postgres可以自动将整数转换为布尔值。关键词是
using some_col_name::boolean
-- here some_col_name is the column you want to do type change

上面的答案是正确的,它帮助了我。只需要一个修改,我使用了类型转换而不是使用 case 语句。

ALTER TABLE mytabe ALTER COLUMN mycolumn DROP DEFAULT;
ALTER TABLE mytabe ALTER mycolumn TYPE bool USING mycolumn::boolean;
ALTER TABLE mytabe ALTER COLUMN mycolumn SET DEFAULT FALSE;

1
接受的答案更好,因为它不依赖于类型转换。例如,这种方法会失败并出现“无法将smallint类型转换为布尔类型”的错误。 - Ben Johnson
5
尝试使用USING mycolumn::text::boolean;。该语句要求你将mycolumn列转换成文本格式,然后再将其转换为布尔值。请注意,这句话只是提供了一个建议,具体情况可能因实际情况而异。 - Scott Bartell

0

同时请检查您的列上是否有任何CHECK约束,例如:

[...] CONSTRAINT blabla CHECK ((field = ANY (ARRAY[0, 1])))

否则,您的ALTER命令将会出现错误,提示“无法转换为布尔类型”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接