¿La CASE
declaración de SQL Server (2008 o 2012, específicamente) evalúa todas las WHEN
condiciones o se cierra una vez que encuentra una WHEN
cláusula que se evalúa como verdadera? Si pasa por todo el conjunto de condiciones, ¿eso significa que la última condición que se evalúa como verdadera sobrescribe lo que hizo la primera condición que se evaluó como verdadera? Por ejemplo:
SELECT
CASE
WHEN 1+1 = 2 THEN'YES'
WHEN 1+1 = 3 THEN 'NO'
WHEN 1+1 = 2 THEN 'NO'
END
El resultado es "SÍ" aunque sea el último momento en que la condición debería hacer que se evalúe como "NO". Parece que sale una vez que encuentra la primera condición VERDADERA. ¿Alguien puede confirmar si este es el caso ?
sql-server
t-sql
case
Juan velez
fuente
fuente
COALESCE()
se traduce en unaCASE
expresión.)Respuestas:
• Devuelve el resultado_expresión de la primera input_expression = when_expression que se evalúa como TRUE .
Referencia http://msdn.microsoft.com/en-us/library/ms181765.aspx
Este es el comportamiento estándar de SQL:
Una
CASE
expresión se evalúa como la primera condición verdadera.Si no hay una condición verdadera, se evalúa en la
ELSE
parte.Si no hay una condición verdadera y ninguna
ELSE
parte, se evalúa comoNULL
.fuente
SQL Server generalmente realiza una evaluación de cortocircuito para sentencias CASE ( SQLFiddle ):
Sin embargo, hay varios tipos de declaraciones que a partir de SQL Server 2012 no provocan un cortocircuito correctamente. Ver el enlace de ypercube en los comentarios.
Oracle siempre realiza evaluaciones de cortocircuitos . Consulte la referencia del lenguaje SQL 11.2 . O compare lo siguiente ( SQLFiddle ):
Esta misma prueba no se puede hacer con MySQL porque devuelve NULL para la división por cero. ( SQL Fiddle )
fuente
Parece que MS SQL Server también usa una evaluación de cortocircuito.
En la siguiente prueba tengo 3 pruebas. El primero siempre es cierto, el segundo falla sin hacer referencia a la tabla y el tercero falla solo cuando se tienen en cuenta los datos.
En esta ejecución particular, ambas filas se devuelven correctamente. Si comento el primer CUÁNDO, o el primero y el segundo, obtengo fallas.
fuente
si la declaración de caso utilizada en la
WHERE
condición y el primer caso cuando la declaración involucra la evaluación de los valores de columna de la tabla, y la primera fila de la tabla no satisface esta condición, la declaración del caso pasará al siguiente caso cuando la declaración.fuente
En MySQL saldrá de la declaración de caso en la primera opción verdadera. Si tiene la posibilidad de múltiples valores verdaderos, desea colocar la respuesta preferida anteriormente en la secuencia.
fuente