caso versus nulo versus fusión


9

Estoy leyendo la documentación de los exámenes de SQL Server 2012 y vi el siguiente punto:

caso versus nulo versus fusión

Ahora, sé CÓMO usar cada uno, pero no sé CUÁNDO usar cada uno. ¿Podría algún cuerpo aclarar? Gracias.

PD. ¿Podríamos tener una etiqueta para las preguntas del examen?


2
COALESCEse expande a, CASEpero obviamente en una CASEdeclaración usted mismo puede ser más flexible en las WHENcondiciones. Para ISNULLvs COALESCE relacionado / duplicado?
Martin Smith

relacionado estoy de acuerdo. pero no dup. Gracias por el comentario :)
Stuart Blackler

Respuestas:


10

ISNULL : disponible solo en SQL Server. Permite la prueba y el reemplazo de un valor NULL por otro.

COALESCE - estándar ANSI. Permite la prueba y la sustitución de un valor NULL con el primer valor no nulo en un conjunto de argumentos de longitud variable. Es importante tener en cuenta que los factores de precedencia del tipo de datos en este

-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1) 
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')

En el ejemplo anterior, 'a' es el primer valor no nulo, pero los datos de caracteres tienen una precedencia menor que el entero.

Otra consideración entre ISNULL vs COALESCE es que se determina que ISNULL es NOT NULL mientras que el resultado de una llamada COALESCE es NULLable. Vea la publicación de JRJ ISNULL () <> COALESCE () Si bien eso puede parecer algo trivial, el optimizador de consultas puede hacer diferentes planes en función de la nulabilidad de una columna.

Puede probar fácilmente la nulabilidad de sus expresiones isnull / coalesce / case ejecutándola a través de dmo sys.dm_exec_describe_first_result_set

-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
    DMO.*
FROM
    sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO

CASO : también una función escalar estándar ANSI. Consideraría el uso de CASE sobre los dos anteriores cuando tengo una prueba que no se puede expresar en un escalar simple, pero esa es una respuesta bastante débil, lo admito.


Gracias por la respuesta completa tan rápido. No tenía idea de que el orden de precedencia importaba COALESCE. Gracias de nuevo
Stuart Blackler

1
CASEes técnicamente una expresión, no una función.
ypercubeᵀᴹ

1

ISNULL le ofrece la posibilidad de devolver 1 repalcement, COALESCE no se limita a un Valor, por ejemplo, COALESCE(v1,v2,v3,v4,v5) si V5 es el único Valor que NO ES NULL, se devolverá

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.