Postgresql 9.4使用值将列文本更改为布尔值

时间:2018-02-20 02:52:49

标签: postgresql

我有一个看起来像这样的表:

CREATE TABLE "TestResults" (
"Id"                text PRIMARY KEY,
"Name"              text NOT NULL UNIQUE,
"Result"            text CHECK ("Comment" IN ('Pass', 'Fail')),
"CreatedBy"         text NOT NULL,
"CreatedOn"         timestamp with time zone NOT NULL,
);

我们正在使用PostgreSQL 9.4

用户当前可以从下拉菜单中选择PassFail,我们已将这些字符串存储在Result列的数据库中。我们想将其更改为布尔值。

如何在保留用户已输入的值的同时,将Result列从文本更改为布尔值?

谢谢。

1 个答案:

答案 0 :(得分:2)

每当您想要更改列的类型但没有从旧值到新值的默认转换时,您希望使用USING clause指定如何将旧值转换为新值:

  

可选的USING子句指定如何从旧的计算新列值;如果省略,则默认转换与从旧数据类型转换为new的赋值相同。如果没有从旧类型到新类型的隐式或赋值转换,则必须提供USING子句。

首先摆脱CHECK约束,你可以通过\d "TestResults"中的psql找到该名称,但它可能是"TestResults_Result_check"

alter table "TestResults" drop constraint "TestResults_Result_check";

然后使用ALTER COLUMN(带有USING子句)来更改类型:

alter table "TestResults"
alter column "Result"
set data type boolean
using case
    when "Result" = 'Pass' then true
    when "Result" = 'Fail' then false
    else null
end;