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.
COALESCEest étendu àCASEmais, évidemment, dans uneCASEdéclaration que vous écrivez vous-même, vous pouvez être plus flexible dans lesWHENconditions. PourISNULLvsCOALESCEliés / en double?