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

How to reuse column alias in another column within same select statement?

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 语句 select [value 1] 然后将外部查询写入 select [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 服务器中,您可以使用 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 似乎是字符串。 value_2case 表达式应该 return 一个字符串,所以 '0' 而不是 0.
  • 我在表达式后使用 as 定义了 table 别名。这是 SQL 标准,但是 本身 使用 = 没有任何错误,这是 SQL 服务器特定语法。