transact subconsultas resueltos ejercicios ejemplos datos consultas avanzadas sql sql-server sql-server-2005 select nested

subconsultas - La mejor forma de hacer una lógica de declaración de caso anidada en SQL Server



in sql server ejemplos (8)

Aquí hay una solución simple para la declaración de caso "compleja" anidada: - Expresión compleja de caso anidado

select datediff(dd,Invdate,''2009/01/31'')+1 as DaysOld, case when datediff(dd,Invdate,''2009/01/31'')+1 >150 then 6 else case when datediff(dd,Invdate,''2009/01/31'')+1 >120 then 5 else case when datediff(dd,Invdate,''2009/01/31'')+1 >90 then 4 else case when datediff(dd,Invdate,''2009/01/31'')+1 >60 then 3 else case when datediff(dd,Invdate,''2009/01/31'')+1 >30 then 2 else case when datediff(dd,Invdate,''2009/01/31'')+1 >30 then 1 end end end end end end as Bucket from rm20090131atb

Solo asegúrese de tener una declaración final para cada declaración de caso

Actualmente estoy escribiendo una consulta SQL, donde algunas de las columnas devueltas deben calcularse dependiendo de bastantes condiciones.

Actualmente estoy usando declaraciones de casos anidados, pero se está volviendo complicado. ¿Hay una forma mejor (más organizada y / o legible)?

(Estoy usando Microsoft SQL Server, 2005)

Un ejemplo simplificado:

SELECT col1, col2, col3, CASE WHEN condition THEN CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation1 ELSE calculation2 END ELSE CASE WHEN condition2 THEN calculation3 ELSE calculation4 END END ELSE CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation5 ELSE calculation6 END ELSE CASE WHEN condition2 THEN calculation7 ELSE calculation8 END END END AS ''calculatedcol1'', col4, col5 -- etc FROM table


Envuelva todos esos casos en uno.

SELECT col1, col2, col3, CASE WHEN condition1 THEN calculation1 WHEN condition2 THEN calculation2 WHEN condition3 THEN calculation3 WHEN condition4 THEN calculation4 WHEN condition5 THEN calculation5 ELSE NULL END AS ''calculatedcol1'', col4, col5 -- etc FROM table


Pasé por esto y encontré todas las respuestas súper geniales, sin embargo, quiero agregar a la respuesta dada por @deejers

SELECT col1, col2, col3, CASE WHEN condition1 THEN calculation1 WHEN condition2 THEN calculation2 WHEN condition3 THEN calculation3 WHEN condition4 THEN calculation4 WHEN condition5 THEN calculation5 END AS ''calculatedcol1'', col4, col5 -- etc FROM table

puede hacer que ELSE sea opcional ya que no es obligatorio, es muy útil en muchos escenarios.


Personalmente lo hago de esta manera, manteniendo confinadas las expresiones CASE incrustadas. También pondría comentarios para explicar lo que está sucediendo. Si es demasiado complejo, divídalo en funcionamiento.

SELECT col1, col2, col3, CASE WHEN condition THEN CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation1 ELSE calculation2 END ELSE CASE WHEN condition2 THEN calculation3 ELSE calculation4 END END ELSE CASE WHEN condition1 THEN CASE WHEN condition2 THEN calculation5 ELSE calculation6 END ELSE CASE WHEN condition2 THEN calculation7 ELSE calculation8 END END AS ''calculatedcol1'', col4, col5 -- etc FROM table


Podemos combinar múltiples condiciones para reducir la sobrecarga de rendimiento.

Deje que haya tres variables abc en las que queremos realizar casos. Podemos hacer esto de la siguiente manera:

CASE WHEN a = 1 AND b = 1 AND c = 1 THEN ''1'' WHEN a = 0 AND b = 0 AND c = 1 THEN ''0'' ELSE ''0'' END,


Podría intentar algún tipo de truco de COALESCE, por ejemplo:

SELECT COALESCE( CASE WHEN condition1 THEN calculation1 ELSE NULL END, CASE WHEN condition2 THEN calculation2 ELSE NULL END, etc... )


Puede combinar varias condiciones para evitar la situación:

CASE WHEN condition1 = true AND condition2 = true THEN calculation1 WHEN condition1 = true AND condition2 = false ELSE ''what so ever'' END,


una función definida por el usuario puede servir mejor, al menos para ocultar la lógica - esp. si necesita hacer esto en más de una consulta