2011-04-26 106 views
5

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

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 

是否有可能使用FirstCheck,SecondCheck,ThirdCheck我在AllChecksOk线做?

我不关心性能,这是每天一次手动运行一次的非常少量的记录,我只是想避免创建视图,表或临时表,并将所有内容保存在单个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 

回答

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 

您还可以使用CROSS APPLY定义3名别名,然后引用它们的主要SELECT列表as in this example

+0

CTE做的工作,我没有看CROSS APPLY,我将其添加为书签的未来。谢谢。 – LaBracca 2011-04-26 13:28:57

3

下面是一个派生表解决方案

SELECT 
    T.ID_Operation, 
    FirstCheck = CASE WHEN T.Expr1 = 0 THEN 0 ELSE 1 END, 
    SecondCheck = CASE WHEN T.Expr2 = 0 THEN 0 ELSE 1 END, 
    ThirdCheck = CASE WHEN T.Expr3 = 0 THEN 0 ELSE 1 END, 
    AllChecksOk = CASE WHEN T.Expr1 + T.Expr2 + T.Expr3 = 3 THEN 'OK' ELSE 'No' END 
FROM 
(
    SELECT 
    ID_Operation, 
    Expr1 = (COMPLEX_EXPRESSION_1), 
    Expr2 = (COMPLEX_EXPRESSION_2), 
    Expr3 = (COMPLEX_EXPRESSION_3) 
    FROM 
    AllOperationsTable 
) T 
相关问题