如何在同一选择语句中的另一列中重用列别名?

问题描述

select pd.id,[value 1] = Case
                    ----
                    End,[value 2] = Case when [value 1] in ('test1','test2') Then 0
                    else [value 1] End

当我尝试在值 2 中使用值 1 时,我得到的列无效。是否有可能使用计算出的 [值 1] 用于 [值 2]

我目前的解决方案是为值 1 创建一个单独的 sp 或视图,但这不是我想要做的。

解决方法

您可以使用 select 语句选择 [value 1],然后编写外部查询来选择 [value 1] 和 [value 2]

SELECT  [value 1],[value 2] = Case when [value 1] in ('test1','test2') Then 0
                    else [value 1] End 
FROM
(
select pd.id,[value 1] = Case
                    ----
                    End
FROM TABLENAME
)T

或者您可以在 [value 2] 的 case 语句中重复 [value 1] 的 case 语句

select pd.id,[value 1] = Case
                    ----
                    End,[value 2] = Case when ( Case
                    ----
                    End [value 1]) in ('test1','test2') Then 0
                    else ( Case
                    ----
                    End [value 1]) End
,

在 SQL Server 中,您可以使用 APPLYFROM 子句中定义列别名——我认为这是个好地方:

select pd.id v.value_1,(Case when value_1 in ('test1','test2') Then '0'
             else value_1
        End) as value_2
from pd cross apply
     (values ( case . . . )
     ) v(value_1);

注意事项:

  • 不要使用需要转义的标识符名称,因此使用 value_1 而不是 value 1
  • value_1 似乎是字符串。 casevalue_2 表达式应返回一个字符串,因此 '0' 而不是 0
  • 我在表达式后使用 as 定义表别名。这是 SQL 标准,但使用 = 没有任何本身错误,这是 SQL Server 特定的语法。