代码之家  ›  专栏  ›  技术社区  ›  Nick Johnson

SQL Server引用计算列

  •  25
  • Nick Johnson  · 技术社区  · 17 年前

    我有一个带有计算列的select语句,我想在另一个计算列中使用一个计算列的值。这可能吗?这里有一个人为的例子来说明我正在尝试做什么。

    SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25
    
    6 回复  |  直到 17 年前
        1
  •  21
  •   shsteimer    17 年前

    不

    select中单个行的所有结果都是原子的。也就是说,您可以将它们都看作是并行发生的,不能相互依赖。

    如果您引用的是计算列,则需要更新公式的输入,以便在选择过程中更改结果。

    将计算列视为宏或小视图,无论何时调用它们,它们都会注入少量计算。

    例如,这些列将始终相同:

    -- assume that 'Calc' is a computed column equal to Salaray*.25
    SELECT Calc, Salary*.25 Calc2 FROM YourTable
    

    还要记住 persisted 选项不会改变这一切。它保留了一个很适合索引的值,但原子性不变。

        2
  •  11
  •   erikkallen    17 年前

    SELECT [calcval1], [calcval1] * .25 AS [calcval2]
    FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)
    
        3
  •  4
  •   HansHarhoff    10 年前

    是的,这是可能的。

    使用 WITH Statement

        4
  •  3
  •   C B dkretz    9 年前

    我可以想出两种方法来做到这一点。首先要了解,在语句运行之前,就SQL Server而言,calval1列并不存在,因此不能直接用于显示示例。因此,您可以将计算放在其中两次,一次用于calval1,另一次作为calval2计算中calcval1的替代。

    select calcval1*.25 as calval2, calval1, field1, field2
    from (select casestament as cavlval1, field1, field2 from my table) a
    

    您需要测试这两种方法的性能。

        5
  •  2
  •   Vikdor    13 年前

    您应该使用外部应用而不是子选择:

    select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V
    
        6
  •  0
  •   Charles Bretana    17 年前


    SELECT [calcval1] = CASE Statement, [calcval2] = [calcval1] * .25 
    

    将成为Select子句输出中的列别名。