| 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   
 
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
 ).
     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 :
 
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> 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 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
 .| 
CREATE TABLE foo SELECT IFNULL(1,"test") as test;
 | 
 
     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
 :
 
Notez que l'argument  
expr1
  est évalué deux fois dans MySQL si les arguments sont égaux.| 
mysql> SELECT NULLIF(1,1);-> NULL
 mysql> SELECT NULLIF(1,2);
 -> 1
 | 
 
     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 : 
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(1>2,2,3);-> 3
 mysql> SELECT IF(1<2,'oui','non');
 -> 'oui'
 mysql> SELECT IF(STRCMP('test','test1'),'non','oui');
 -> 'non'
 | 
 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 :| 
mysql> SELECT IF(0.1,1,0);-> 0
 mysql> SELECT IF(0.1<>0,1,0);
 -> 1
 | 
 
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)
| 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 |  
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
 | 
 |