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

mkh*_*ra2 6 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,
);
Run Code Online (Sandbox Code Playgroud)

我们使用的是 PostgreSQL 9.4

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

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

谢谢你。

mu *_*ort 7

任何时候你想改变一个列的类型但没有从旧值到新值的默认转换,你想使用一个USING 子句来指定如何将旧值转换为新值:

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

因此,首先摆脱 CHECK 约束,您可以通过执行\d "TestResults"from找到名称,psql但它可能是"TestResults_Result_check"

alter table "TestResults" drop constraint "TestResults_Result_check";
Run Code Online (Sandbox Code Playgroud)

然后使用 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;
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你!这正是我一直在寻找的。我无法找到有关如何使用“case”语句的信息。总的来说,postgreSQL 的文档非常精彩,但我发现它在这方面有所欠缺。 (2认同)