web-dev-qa-db-fra.com

Quelle est la différence entre isnull 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 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.

51
shree18

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'
70
Aleks G

Avantages de 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.

Inconvénients de 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.

CV

À 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:

  • Expressions à calcul long ou expressions avec effets secondaires dans MSSQL (selon la documentation, COALESCE(expr1, …) peut évaluer expr1 deux fois).
  • Utilisation dans GROUP BY ou avec des expressions de requête dans c-treeACE.
  • Etc.
14
Sasha

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.

5
praba

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.

0
jboi