2011-04-26 12 views
5

tengo algo así como¿Cómo usar los valores de las columnas condicional en la misma instrucción de selección?

(COMPLEX_EXPRESSION_N gradas durante mucho subconsulta)

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 

¿Es posible utilizar FirstCheck, SecondCheck, ThirdCheck como lo hice en la línea AllChecksOk?

No me preocupa el rendimiento, esto es algo que se ejecuta manualmente una vez al día en un número muy pequeño de registros, solo quiero evitar la creación de vistas, tablas o tablas temporales y mantener todo en una sola sentencia select .

Como altenrative puedo hacer esto, pero hace que la consulta menos legible (como tengo que escribir dos veces cada expresión compleja):

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 

Respuesta

4

No se puede hacer referencia a un alias de columna en el select pero puedes usar un CTE como a continuación.

;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 

También puede utilizar CROSS APPLY para definir los alias de columnas 3 a continuación, hacer referencia a ellos en la lista principal SELECTas in this example.

+0

CTE hizo el trabajo, no me veía a CROSS APPLY, voy a ponerle un marcador para el futuro. Gracias. – LaBracca

3

A continuación se muestra una solución tabla derivada

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 
Cuestiones relacionadas