Estoy escribiendo una consulta SQL, donde algunas de las columnas devueltas deben calcularse dependiendo de muchas condiciones.
Actualmente estoy usando declaraciones de casos anidados, pero se está volviendo desordenado. ¿Hay una manera 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
CASE WHEN
Respuestas:
Puedes probar algún tipo de truco de COALESCE, por ejemplo:
fuente
Envuelva todos esos casos en uno.
fuente
Puede combinar múltiples condiciones para evitar la situación:
fuente
Personalmente lo hago de esta manera, manteniendo las expresiones CASE incrustadas confinadas. También pondría comentarios para explicar lo que está sucediendo. Si es demasiado complejo, divídalo en función.
fuente
Aquí hay una solución simple para el enunciado de caso "Complejo" anidado: - Expresión de caso complejo anidado
Solo asegúrese de tener una declaración final para cada declaración de caso
fuente
Podemos combinar múltiples condiciones para reducir la sobrecarga de rendimiento.
Supongamos que hay tres variables abc en las que queremos realizar casos. Podemos hacer esto de la siguiente manera:
fuente
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
fuente
Revisé esto y encontré todas las respuestas súper geniales, sin embargo, quiero agregar a la respuesta dada por @deejers
puede hacer que ELSE sea opcional ya que no es obligatorio, es muy útil en muchos escenarios.
fuente
Este ejemplo podría ayudarlo, la imagen muestra cómo se verá la declaración de caso SQL cuando haya bucles if y más de un bucle if interno
fuente