Quelle est la différence entre ifnull et coalesce dans mysql?
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 de l'argument. Pour ifnull
c'est deux paramètres et coalesce 2 ou 3 Nous pouvons passer,sauf que Avons-nous une autre différence entre ces deux?
Et comment cela diffère dans MSSql.
5 réponses
La principale différence entre les deux est que IFNULL
fonction prend deux arguments et retourne la première, si ce n'est pas NULL
, ou le second si le premier est NULL
.
COALESCE
la fonction peut prendre deux paramètres ou plus et renvoie le premier paramètre non nul, 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'
UPDATE: MSSQL effectue une vérification de type et de paramètre plus stricte. En outre, il n'a pas IFNULL
fonction mais plutôt ISNULL
fonction, qui doit connaître les types d'arguments. Par conséquent:
SELECT ISNULL(NULL, NULL);
-> results in an error
SELECT ISNULL(NULL, CAST(NULL as VARCHAR));
-> returns NULL
Aussi la fonction COALESCE
dans MSSQL nécessite au moins un paramètre non null, 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'
Avantages de COALESCE
-
COALESCE
est la fonction SQL standard .Alors que
IFNULL
est spécifique à MySQL et son équivalent dans MSSQL (ISNULL
) est spécifique à MSSQL. -
COALESCE
peut travailler avec deux ou plusieurs arguments (en fait, il peut fonctionner avec un seul argument, mais il est assez inutile dans ce cas:COALESCE(a)
≡a
).Alors que les
IFNULL
de MySQL et lesISNULL
de MSSQL sont des versions limitées de {[0] } qui peuvent fonctionner avec deux arguments seulement.
Inconvénients de COALESCE
-
Par Transact documentation SQL,
COALESCE
est juste un sucre de syntaxe pourCASE
et peut évaluer ses arguments plus d'une 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é deCOALESCE
dans MSSQL.D'autre part,
ISNULL
dans MSSQL est une fonction normale et n'évalue jamais ses arguments plus d'une fois. {[0] } dans MySQL et PostgreSQL, ni n'évalue ses arguments plus que lorsque. -
À ce stade, Je ne sais pas exactement comment les normes SQL définissent
COALESCE
.Comme nous le voyons au point précédent, les implémentations réelles dans le SGBDR varient: certains (par exemple MSSQL) font
COALESCE
pour évaluer ses arguments plus d'une fois, certains (par exemple MySQL, PostgreSQL) - ne le font pas.C-treeACE, qui prétend 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 une requête expression."Je ne sais pas si ces restrictions sont vraiment dans SQL-standard; la plupart des implémentations réelles deCOALESCE
(par exemple MySQL, PostgreSQL) n'ont pas de telles restrictions.IFNULL
/ISNULL
, comme les fonctions normales, n'ont pas de telles restrictions, soit.
Reprendre
Sauf si vous rencontrez des restrictions spécifiques de COALESCE
dans un SGBDR spécifique, je vous recommande de toujours utiliser COALESCE
comme plus standard et plus générique.
Les exceptions sont:
- expressions longues ou expressions avec des effets secondaires dans MSSQL (comme, selon la documentation,
COALESCE(expr1, …)
peut évaluerexpr1
deux fois). - utilisation dans
GROUP BY
ou avec des expressions de requête dans c-treeACE. - etc.
Différences dans SQL-Server:
Il n'y a pas de
IFNULL()
fonction similaire, mais unISNULL()
-
ISNULL
prend seulement 2 Paramètres alors que COALESCE prend un nombre variable de paramètres -
COALESCE
est basé sur la norme ANSI SQL alors queISNULL
est une fonction TSQL propriétaire -
Les Validations pour
ISNULL
etCOALESCE
sont également différentes. Par exemple,NULL
valeur pourISNULL
est converti en int, alors que pourCOAELSCE
Vous devez fournir un type. Ex:ISNULL(NULL,NULL)
: est de type int.COALESCE(NULL,NULL)
: va jeter 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'expressionCASE
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 {[1] } peut remplacer n'importe quelle valeur par une autre valeur. Avec coalesce
dans 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 il n'est pas possible de faire avec ifnull
.
Ce SQL db2 ne fonctionnera pas avec COALESE, Je ne verrai aucune ligne récupérée. Depuis que J'ai utilisé IFNULL, cela fonctionne comme prévu
select a.mbitno ,a.mbstqt,ifnull(b.apr,0)
from
(
select mmstcd,mbstat,mbfaci,mbwhlo,mbitno,mbstqt,MBALQT from libl.mitbal inner join libl.mitmas on
mmcono=mbcono and mmitno=mbitno
where mbcono=200 and mbstat in ('20','50') and mmstcd>0
)
as a left join
(
select mlfaci,mlwhlo,mlitno,mlstas,sum(mlstqt) as APR from libl.mitloc where mlcono=200 and mlstas='2'
group by mlfaci,mlwhlo,mlitno,mlstas
)
b on b.mlfaci=a.mbfaci and b.mlwhlo=a.mbwhlo and b.mlitno=a.mbitno
where a.mbitno in 'GWF0240XPEC' and a.mbstqt>0 and a.mbstqt<>ifnull(b.apr,0)