27

我有一个带有计算列的 select 语句,我想在另一个计算列中使用一个计算列的值。这可能吗?这是一个人为的例子来展示我想要做什么。

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

6 回答 6

21

不。

选择中单行的所有结果都是原子的。也就是说,您可以将它们全部视为并行发生并且不能相互依赖。

如果您指的是计算列,那么您需要更新公式的输入,以便在选择期间更改结果。

将计算列视为宏或迷你视图,在调用它们时会注入一些计算。

例如,这些列总是相同的:

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

另请记住,该persisted选项不会改变任何这些。它保留了适合索引的值,但原子性不会改变。

于 2009-01-05T17:01:58.863 回答
11

不幸的是,并非如此,但有时值得的解决方法是

SELECT [calcval1], [calcval1] * .25 AS [calcval2]
FROM (SELECT [calcval1] = CASE Statement FROM whatever WHERE whatever)
于 2009-01-05T17:54:34.703 回答
4

是的,这是可能的。

使用WITH 语句进行嵌套选择:

于 2015-08-22T09:15:59.597 回答
3

我能想到两种方法来做到这一点。首先要了解,就 SQL Server 而言,在语句运行之前,calval1 列不存在,因此不能直接使用它,如您的示例所示。因此,您可以将计算放在那里两次,一次用于 calval1,一次用于替换 calval2 计算中的 calcval1。另一种方法是创建一个包含 calval1 的派生表,然后在派生表之外计算 calval2,如下所示:

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

您需要测试两者的性能。

于 2009-01-05T17:05:37.157 回答
2

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

select V.calc,V.calc*0.25 from FOO outer apply (select case Statement as calc) V
于 2012-11-20T15:39:37.977 回答
0

您不能在 Select 子句中“重置”计算列的值,如果这是您要尝试做的事情...计算列的值基于计算列公式。哪个可以包含另一个计算列的值....但是您不能重置 Select 子句中的公式...如果您要做的只是“输出”基于两个计算列的值,(如您的语法中的问题读取”然后“[calcval2]”

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

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

还是您在问如何定义一个计算列的公式以基于另一个计算列?

于 2009-01-05T17:02:29.317 回答