7.3.8 Fonctions de contrôle

  • IFNULL(expr1,expr2) Si expr1 n'est pas NULL, IFNULL() retourne expr1, sinon expr2. IFNULL() retourne un nombre ou une chaîne, en fonction du contexte dans lequel il est utilisé.
    mysql> select IFNULL(1,0);
            -> 1
    mysql> select IFNULL(0,10);
            -> 0
    mysql> select IFNULL(1/0,10);
            -> 10
    mysql> select IFNULL(1/0,'yes');
            -> 'yes'
    
  • IF(expr1,expr2,expr3) Si expr1 est vraie (TRUE) (expr1 <> 0 et expr1 <> NULL) alors IF() retourne expr2, sinon il retourne expr3. IF() retourne un nombre ou une chaîne, en fonction du contexte dans lequel il est utilisé.
    mysql> select IF(1>2,2,3);
            -> 3
    mysql> select IF(1<2,'yes','no');
            -> 'yes'
    mysql> select IF(strcmp('test','test1'),'yes','no');
            -> 'no'
    

    expr1 est évaluée en tant qu'entier, ce qui signifie que si le test portait sur un nombre à virgule flottante ou une chaîne, il faudrait mieux utiliser un opérateur de comparaison.

    mysql> select IF(0.1,1,0);
            -> 0
    mysql> select IF(0.1<>0,1,0);
            -> 1
    

    Dans le premier cas ci-dessus, IF(0.1) retourne 0 car 0.1 est converti en un nombre entier, ce qui conduit à un test de type IF(0). C'est une source d'erreur. Dans le deuxième cas, la comparaison est faite avec un opérateur de comparaison, qui teste la non nullité. Le résultat de la comparaison est utilisé comme un entier.

  • CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
  • CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END La première version retourne result si value=compare-value. La seconde version retourne le résultat si la première condition est vraie. Si il n'y a aucun résultat, alors, le résultat après ELSE est retourné. SI il n'y a pas de résultat pour ELSE alors NULL.
    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