【问题标题】:How to create table with computed column and if statement?如何使用计算列和 if 语句创建表?
【发布时间】:2020-08-23 21:48:46
【问题描述】:

如标题所示,我正在尝试在 SQL Server 上创建一个表,其中包含带有 if 语句的计算列。我已经创建了基本列,目前正在尝试使用 ALTER TABLE 添加计算列。

在声明中: ALTER table zgodnosc add proba as IIF([Zmiana_1_postoj] = 0 ,-50,[Zmiana_1]) float; 我有错误 'float' 附近的语法不正确。 我尝试了很多组合,总是出错。数据类型是:Zmiana_postoj_1 - 位,Zmiana_1 - int。 有人知道如何正确写吗? 谢谢!

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql-server tsql ddl calculated-columns


【解决方案1】:

在 SQL Server 中,您将使用:

alter table zgodnosc add proba as (case when Imiana_1_postoj] = 0 then -50 else Zmiana_1 end) ;

不需要类型。额外的括号不是必需的。我习惯性地将它们包括在内有两个原因。首先,check 约束需要它们。其次,它们在视觉上对表达进行了很好的界定。

如果你想要一个特定的类型,你可以转换/转换:

alter table zgodnosc add proba as (convert(float, (case when Imiana_1_postoj] = 0 then -50 else Zmiana_1 end))

注意:我强烈反对使用IIF()。它被引入 SQL Server 以向后兼容 MS Access。 CASE 是 SQL 中处理条件逻辑的标准方法。

【讨论】:

    【解决方案2】:

    去掉float - SQL Server 将根据表达式的数据类型推断数据类型。

    如果将-50 替换为-5E1-50e0,则表达式的数据类型将变为float

    ALTER table zgodnosc add proba as IIF([Zmiana_1_postoj] = 0 ,-50e0,[Zmiana_1]);
    

    尽管您可能更愿意对此进行更明确的说明。

    我个人更喜欢IIF 的简洁性而不是CASE WHEN ELSE END。我怀疑计算的列语法是否可以转移到其他 RDBMS 上。

    【讨论】:

    • 如果我想在其他计算列中使用计算列怎么办?我有这个错误:表'zgodnosc'中的计算列'Doba'不允许在另一个计算列定义中使用。我不知道我是否可以用它做任何事情
    • 您不能嵌套计算列。如果您想在另一个中重用一个,则需要复制定义,即在这种情况下是底层 IIF 表达式
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2022-01-19
    • 2019-10-03
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多