如何在同一个select语句中使用条件列值?

LaB*_*cca 5 sql-server case sql-server-2008 conditional-statements

我有类似的东西

(COMPLEX_EXPRESSION_N代表长子查询)

select
  ID_Operation,
  FirstCheck = CASE WHEN (COMPLEX_EXPRESSION_1)= 0 then 0 else 1 end,
  SecondCheck = CASE WHEN (COMPLEX_EXPRESSION_2)= 0 then 0 else 1 end,
  ThirdCheck = CASE WHEN (COMPLEX_EXPRESSION_3)= 0 then 0 else 1 end,
  AllChecksOk = Case WHEN 
               (FirstCheck + SecondCheck + Third CHeck = 3) 
               Then 'OK' Else 'No' End
from 
  AllOperationsTable
Run Code Online (Sandbox Code Playgroud)

是否可以像在AllChecksOk系列中那样使用FirstCheck,SecondCheck,ThirdCheck?

我不关心性能,这是每天在非常少量的记录上手动运行的东西,我只是想避免创建视图,表或临时表并将所有内容保存在单个select语句中.

作为一个altenrative,我可以做到这一点,但它使查询的可读性降低(因为我需要为每个复杂的表达式编写两次):

select
  ID_Operation,
  FirstCheck = CASE WHEN (COMPLEX_EXPRESSION_1)= 0 then 0 else 1 end,
  SecondCheck = CASE WHEN (COMPLEX_EXPRESSION_2)= 0 then 0 else 1 end,
  ThirdCheck = CASE WHEN (COMPLEX_EXPRESSION_3)= 0 then 0 else 1 end,
  AllChecksOk = Case WHEN 
               (COMPLEX_EXPRESSION_1+ COMPLEX_EXPRESSION_2+ 
               COMPLEX_EXPRESSION_3CHeck = 3) Then 'OK' Else 'No' End
from 
  AllOperationsTable
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 4

您不能在 中引用列别名,select但可以使用 CTE,如下所示。

;WITH CTE AS
(
select
  ID_Operation,
  FirstCheck = CASE WHEN (COMPLEX_EXPRESSION_1)= 0 then 0 else 1 end,
  SecondCheck = CASE WHEN (COMPLEX_EXPRESSION_2)= 0 then 0 else 1 end,
  ThirdCheck = CASE WHEN (COMPLEX_EXPRESSION_3)= 0 then 0 else 1 end
from 
  AllOperationsTable
)
SELECT *,
       AllChecksOk = Case WHEN 
               (COMPLEX_EXPRESSION_1+ COMPLEX_EXPRESSION_2+ 
               COMPLEX_EXPRESSION_3CHeck = 3) Then 'OK' Else 'No' End
FROM CTE
Run Code Online (Sandbox Code Playgroud)

您还可以CROSS APPLY定义 3 个列别名,然后在主SELECT列表中引用它们,如本例所示