Si l'argument expr1
n'est pas
NULL
, la fonction
IFNULL()
retournera l'argument
expr1
, sinon elle retournera l'argument
expr2
. La fonction
IFNULL()
retourne une valeur numérique ou
une chaîne de caractères, suivant le contexte
d'utilisation :
mysql>SELECT IFNULL(1,0);
-> 1 mysql>SELECT IFNULL(NULL,10);
-> 10 mysql>SELECT IFNULL(1/0,10);
-> 10 mysql>SELECT IFNULL(1/0,'oui');
-> 'oui'
En version 4.0.6 et plus récent, le résultat par défaut de
IFNULL(expr1,expr2)
est le plus "général"
des deux expressions, dans l'ordre de type
STRING
, REAL
ou
INTEGER
. La différence avec les anciennes
versions de MySQL ne seront notables que si vous créez une
table basée sur des expressions, ou si MySQL stocke en
interne des valeurs issues de IFNULL()
dans
une table temporaire.
mysql>CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
mysql>DESCRIBE tmp;
+-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | test | varbinary(4) | NO | | | | +-------+--------------+------+-----+---------+-------+
Le type de la colonne test
est
VARBINARY(4)
tandis que dans les versions
plus anciennes, vous auriez obtenu un
BIGINT
.
Si l'expression expr1 = expr2
est vrai, la
fonction retourne NULL
sinon elle retourne
expr1
. Cela revient à faire CASE
WHEN x = y THEN NULL ELSE x END
:
mysql>SELECT NULLIF(1,1);
-> NULL mysql>SELECT NULLIF(1,2);
-> 1
Notez que l'argument expr1
est évalué
deux fois dans MySQL si les arguments sont égaux.
Si l'argument expr1
vaut TRUE
(expr1 <> 0
et expr1
<> NULL
) alors la fonction
IF()
retourne l'argument
expr2
, sinon, elle retourne l'argument
expr3
. La fonction IF()
retourne une valeur numérique ou une chaîne de caractères,
suivant le contexte d'utilisation :
mysql>SELECT IF(1>2,2,3);
-> 3 mysql>SELECT IF(1<2,'oui','non');
-> 'oui' mysql>SELECT IF(STRCMP('test','test1'),'non','oui');
-> 'non'
Si l'argument expr2
ou
expr3
est explicitement
NULL
alors le type du résultat de la
fonction IF()
est le type de la colonne non
NULL
. (Ce comportement est nouveau dans
MySQL 4.0.3).
L'argument expr1
est évalué comme un
entier, cela signifie que si vous testez un nombre à virgule
flottante ou une chaîne de caractères, vous devez utiliser
une opération de comparaison :
mysql>SELECT IF(0.1,1,0);
-> 0 mysql>SELECT IF(0.1<>0,1,0);
-> 1
Dans le premier exemple ci-dessus, IF(0.1)
retourne 0
parce que 0.1
est converti en une chaîne de caractères, ce qui revient à
tester IF(0)
. Ce n'est certainement pas ce
que vous désireriez. Dans le second exemple, la comparaison
teste si le nombre à virgule flottante est différent de
zéro. Le résultat de cette comparaison sera un entier.
Le type de la fonction IF()
(ce qui peut
être important s'il est stocké dans une table temporaire)
est calculé, dans la Version 3.23 de MySQL, comme suit :
Expression | Valeur retournée |
expr2 ou expr3 retourne une chaîne | chaîne |
expr2 ou expr3 retourne un nombre à virgule | nombre à virgule |
expr2 ou expr3 retourne un entier | entier |
Si expr2 et expr3 sont des chaînes de caractères, alors le résultat est insensible à la casse si les deux chaînes de caractères sont insensibles à la casse. (A partir de la version 3.23.51 de MySQL)
CASE valeur WHEN [compare-value] THEN résultat [WHEN
[compare-value] THEN résultat ...] [ELSE résultat]
END
, CASE WHEN [condition] THEN résultat
[WHEN [condition] THEN résultat ...] [ELSE résultat]
END
La première version retourne résultat
si
valeur=compare-value
. La seconde version
retourne le résultat de la première condition qui se
réalise. Si aucune des conditions n'est réalisé, alors le
résultat de la clause ELSE
est retourné.
Si il n'y a pas de clause ELSE
alors
NULL
est retourné :
mysql>SELECT CASE 1 WHEN 1 THEN "un"
WHEN 2 THEN "deux" ELSE "plus" END; -> "un" mysql>SELECT CASE WHEN 1>0 THEN "vrai" ELSE "faux" END;
-> "vrai" mysql>SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;
-> NULL
Le type de la valeur retournée (INTEGER
,
DOUBLE
ou STRING
) est de
même type que la première valeur retournée (l'expression après
le premier THEN
).
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.