13 Fonctions à utiliser dans les clauses SELECT et WHERE
Manuel de Référence MySQL 4.1 : Version Française
. Opérateurs et fonctions tous types ->Les fonctions de contrôle . Fonctions de chaînes de caractères . Fonctions numériques . Fonctions de dates et d'heures . Recherche en texte intégral ( Full-text ) dans MySQL . Fonctions de transtypage . Autres fonctions . Fonctions et options à utiliser dans les clauses GROUP BY
|
13.2 Les fonctions de contrôle
-
IFNULL(expr1,expr2)
-
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.
CREATE TABLE foo SELECT IFNULL(1,"test") as test;
|
En MySQL 4.0.6, le type de la colonne
test
est
CHAR(4)
tandis que dans
les versions plus anciennes, vous auriez obtenu un
BIGINT
.
-
NULLIF(expr1,expr2)
-
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.
-
IF(expr1,expr2,expr3)
-
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
).
|