MySQL, coalesce équivalent pour les valeurs vides?

Je sais que coalesce retournera la première valeur non nulle qui lui est transmise. y a-t-il quelque chose de simlilar qui retournera la première valeur non vide / pas fausse?

Exemple:

select FunctionIWant(0,'','banana') as fruit;  //returns banana.
46
demandé sur OMG Ponies 2010-11-05 00:26:35

4 réponses

Utilisez L'instruction/expression ANSI CASE :

SELECT CASE 
         WHEN LENGTH(col) = 0 OR col IS NULL THEN 'banana'
         ELSE col
       END AS fruit

Il n'y a pas de booléen dans SQL, ou MySQL. MySQL stocke réellement la valeur comme un INT, valeurs zéro ou un:

SELECT CASE 
         WHEN col = 0 THEN 'banana'
         ELSE col
       END AS fruit
9
répondu OMG Ponies 2010-11-04 21:29:06

Vous pouvez faire NULL à partir d'une chaîne vide dans MySQL:

SELECT coalesce(NULLIF(email, ''), 'user@domain.com') FROM users WHERE id=1000000;
129
répondu Fedir RYKHTIK 2012-05-09 15:52:00

Il N'y a pas une telle fonction dans MySQL, mais vous pouvez développer votre propre fonction stockée. La principale difficulté ici est que le nombre de paramètres à passer à la fonction peut varier.

Une solution possible pourrait être de passer une chaîne avec un ensemble de valeurs séparées par un séparateur en utilisant la fonction CONCAT_WS (Voir CONCAT_WS() fonction ). Vous devrez également définir un délimiteur de chaîne au cas où votre séparateur serait inclus dans l'une des valeurs de l'ensemble.

Voici un exemple de script:

DELIMITER |;
CREATE FUNCTION MY_COALESCE (
     p_set_string TEXT
    ,p_delimiter CHAR(1)
  ) RETURNS TEXT
    DETERMINISTIC
BEGIN

    RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(
              REPLACE(REPLACE(
                      CONCAT(p_delimiter,p_set_string,p_delimiter)
                     ,CONCAT(p_delimiter,'0',p_delimiter),'')
                 ,CONCAT(p_delimiter,p_delimiter),'')
             ,p_delimiter,2),p_delimiter,-1)
    ;
END;
|;
DELIMITER ;

SET @separator=',', @delimiter='$';
SELECT
  MY_COALESCE(
      CONCAT_WS(CONCAT(@delimiter,@separator,@delimiter),0,'','banana')
     ,@delimiter
    ) as fruit
;

Lors de l'exécution du script précédent, vous obtenez la sortie suivante:

MySQL> --------------
MySQL> SET @separator=',', @delimiter='$'
MySQL> --------------
MySQL> 
MySQL> Query OK, 0 rows affected (0.00 sec)
MySQL> 
MySQL> --------------
MySQL> SELECT
MySQL>   MY_COALESCE(
MySQL>       CONCAT_WS(CONCAT(@delimiter,@separator,@delimiter),0,'','banana')
MySQL>      ,@delimiter
MySQL>     ) as fruit
MySQL> --------------
MySQL> 
MySQL> +--------+
MySQL> | fruit  |
MySQL> +--------+
MySQL> | banana |
MySQL> +--------+
MySQL> 1 row in set (0.02 sec)

Vous pouvez bien sûr adapter la valeur du délimiteur de chaîne afin qu'il n'y ait aucun conflit avec vos valeurs définies.

1
répondu Bruno Gautier 2010-11-22 09:51:27

Cela a fonctionné pour moi:

SELECT IF(myValue > 0, myValue, 'empty string') AS Value FROM myTable;
0
répondu Andrei 2016-04-19 15:44:51