select ifnull(null,'replaces the null')
-->replaces the null
select coalesce(null,null,'replaces the null')
-->replaces the null
Dans les deux clauses, la principale différence est le passage d'arguments. Pour ifnull
c'est deux paramètres et coalescent 2 ou 3 nous pouvons passer, sauf que nous avons une autre différence entre ces deux? Et comment il diffère dans MSSql.
La principale différence entre les deux est que la fonction IFNULL
prend deux arguments et retourne le premier si ce n'est pas NULL
ou le second si le premier est NULL
.
La fonction COALESCE
peut prendre deux paramètres ou plus et retourne le premier paramètre non NULL, ou NULL
si tous les paramètres sont nuls, par exemple:
SELECT IFNULL('some value', 'some other value');
-> returns 'some value'
SELECT IFNULL(NULL,'some other value');
-> returns 'some other value'
SELECT COALESCE(NULL, 'some other value');
-> returns 'some other value' - equivalent of the IFNULL function
SELECT COALESCE(NULL, 'some value', 'some other value');
-> returns 'some value'
SELECT COALESCE(NULL, NULL, NULL, NULL, 'first non-null value');
-> returns 'first non-null value'
PDATE: MSSQL effectue une vérification plus stricte des types et des paramètres. De plus, il n'a pas la fonction IFNULL
mais plutôt la fonction ISNULL
, qui a besoin de connaître les types des arguments. Par conséquent:
SELECT ISNULL(NULL, NULL);
-> results in an error
SELECT ISNULL(NULL, CAST(NULL as VARCHAR));
-> returns NULL
De plus, la fonction COALESCE
dans MSSQL nécessite qu'au moins un paramètre soit non nul, donc:
SELECT COALESCE(NULL, NULL, NULL, NULL, NULL);
-> results in an error
SELECT COALESCE(NULL, NULL, NULL, NULL, 'first non-null value');
-> returns 'first non-null value'
COALESCE
COALESCE
est une fonction standard SQL .
Alors que IFNULL
est spécifique à MySQL et son équivalent dans MSSQL (ISNULL
) est spécifique à MSSQL.
COALESCE
peut fonctionner avec deux arguments ou plus (en fait, il peut fonctionner avec un seul argument, mais est assez inutile dans ce cas : COALESCE(a)
≡ a
).
Alors que IFNULL
de MySQL et ISNULL
de MSSQL sont des versions limitées de COALESCE
qui ne peuvent fonctionner qu'avec deux arguments.
COALESCE
Per documentation Transact SQL , COALESCE
n'est qu'un sucre de syntaxe pour CASE
et peut évaluer ses arguments plusieurs fois . Plus en détail: COALESCE(a1, a2, …, aN)
≡CASE WHEN (a1 IS NOT NULL) THEN a1 WHEN (a2 IS NOT NULL) THEN a2 ELSE aN END
. Cela réduit considérablement l'utilité de COALESCE
dans MSSQL.
D'un autre côté, ISNULL
dans MSSQL est une fonction normale et n'évalue jamais ses arguments plus d'une fois. COALESCE
dans MySQL et PostgreSQL n'évalue pas ses arguments plus d'une fois.
À ce stade, je ne sais pas exactement comment les normes SQL définissent COALESCE
.
Comme nous le voyons du point précédent, les implémentations réelles dans RDBMS varient: certaines (par exemple MSSQL) font COALESCE
pour évaluer ses arguments plus d'une fois, certaines (par exemple MySQL, PostgreSQL) - pas.
c-treeACE, qui affirme que son implémentation COALESCE
est compatible SQL-92 , dit: "Cette fonction n'est pas autorisée dans une clause GROUP BY. Les arguments de cette fonction ne peuvent pas être des expressions de requête. " Je ne sais pas si ces restrictions sont vraiment conformes au standard SQL; la plupart des implémentations réelles de COALESCE
(par exemple MySQL, PostgreSQL) n'ont pas de telles restrictions. IFNULL
/ISNULL
, en tant que fonctions normales, n'ont pas de telles restrictions non plus.
À moins que vous ne soyez confronté à des restrictions spécifiques de COALESCE
dans un SGBDR spécifique, je recommanderais de toujours utiliser COALESCE
comme standard et plus générique.
Les exceptions sont:
COALESCE(expr1, …)
peut évaluer expr1
deux fois).GROUP BY
ou avec des expressions de requête dans c-treeACE.Différences dans SQL-Server:
Il n'y a pas de fonction IFNULL()
mais une fonction ISNULL()
similaire
ISNULL
ne prend que 2 paramètres alors que COALESCE prend un nombre variable de paramètres
COALESCE
est basé sur la norme SQL ANSI tandis que ISNULL
est une fonction TSQL propriétaire
Les validations pour ISNULL
et COALESCE
sont également différentes. Par exemple, NULL
la valeur de ISNULL
est convertie en int, tandis que pour COAELSCE
vous devez fournir un type. Ex:
ISNULL(NULL,NULL)
: est int.
COALESCE(NULL,NULL)
: lancera une erreur.
COALESCE(CAST(NULL as int),NULL)
: est valide et renvoie int.
Détermination du type de données de l'expression résultante - ISNULL
utilise le premier type de paramètre, COALESCE
suit les règles d'expression CASE
et renvoie le type de valeur avec la priorité la plus élevée.
ifnull
ne peut remplacer qu'une valeur nulle du premier paramètre. Alors que coalesce
peut remplacer n'importe quelle valeur par une autre valeur. Avec coalesce
en SQL standard, vous pouvez avoir de nombreux paramètres transformant de nombreuses valeurs.
MODIFIEZ l'exemple en fonction des commentaires ci-dessous.
Exemple: coalesce(null, null, null, 'b*', null, 'null*')
renvoie 'b *' et ce n'est pas possible avec ifnull
.