cas versus isnull versus coalesce

9

Je lis simplement la documentation des examens SQL Server 2012 et j'ai vu le point suivant:

cas versus isnull versus coalesce

Maintenant, je sais COMMENT utiliser chacun mais je ne sais pas QUAND utiliser chacun. Pourriez-vous clarifier quelque chose? Merci.

Ps. Pourrions-nous avoir une étiquette pour les questions d'examen?

Stuart Blackler
la source
2
COALESCEest étendu à CASEmais, évidemment, dans une CASEdéclaration que vous écrivez vous-même, vous pouvez être plus flexible dans les WHENconditions. Pour ISNULLvs COALESCE liés / en double?
Martin Smith
connexes je suis d'accord. mais pas dup. Merci pour le commentaire :)
Stuart Blackler

Réponses:

10

ISNULL - disponible uniquement dans SQL Server. Permet de tester et de remplacer une valeur NULL par une autre.

COALESCE - norme ANSI. Permet le test et le remplacement d'une valeur NULL par la première valeur non nulle dans un ensemble d'arguments de longueur variable. Il est important de noter que les facteurs de priorité des types de données dans ce

-- 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')

Dans l'exemple ci-dessus, «a» est la première valeur non nulle, mais les données de caractère ont une priorité inférieure à l'entier.

Une autre considération entre ISNULL et COALESCE est que la résultante de ISNULL est déterminée comme étant NON NULL tandis que le résultat d'un appel COALESCE est NULLable. Voir le post de JRJ ISNULL () <> COALESCE () Bien que cela puisse sembler anodin, l'optimiseur de requête peut faire différents plans en fonction de la nullité d'une colonne.

Vous pouvez facilement tester la nullité de vos expressions isnull / coalesce / case en l'exécutant via le 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

CASE - Également une fonction scalaire standard ANSI. J'envisagerais d'utiliser CASE au cours des deux précédents lorsque j'ai un test qui ne peut pas être exprimé dans un simple scalaire mais c'est une réponse assez faible, je l'admets.

billinkc
la source
Merci pour la réponse complète si rapidement. Je ne savais pas que l'ordre de priorité importait COALESCE. Merci encore
Stuart Blackler
1
CASEest techniquement une expression, pas une fonction.
ypercubeᵀᴹ
1

ISNULL vous donne la possibilité de renvoyer 1 repalcement, COALESCE n'est pas limité à une seule valeur, par exemple COALESCE(v1,v2,v3,v4,v5) si V5 est la seule valeur qui n'est PAS NULL, elle sera retournée

bummi
la source