2010-11-04 9 views
42

Je sais que coalesce retournera la première valeur non nulle qui lui est passée. Y a-t-il quelque chose de simlilar qui retournera la première valeur non vide/non fausse?MySQL, coalesce équivalent pour les valeurs vides?

exemple:

select FunctionIWant(0,'','banana') as fruit; //returns banana. 

Répondre

7

Utilisez la norme ANSI CASE statement/expression:

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

Il n'y a pas booléen dans SQL ou MySQL. MySQL stocke en fait la valeur en tant que INT, zéro ou un:

SELECT CASE 
     WHEN col = 0 THEN 'banana' 
     ELSE col 
     END AS fruit 
1

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 à transmettre à la fonction peut varier. Une solution possible pourrait être de transmettre une chaîne avec un ensemble de valeurs séparées par un séparateur en utilisant la fonction CONCAT_WS (voir CONCAT_WS() function). Vous devez é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 séparateur de chaîne donc il a gagné » t être tout conflit avec vos valeurs définies.

113

Vous pouvez faire NULL de chaîne vide dans MySQL:

SELECT coalesce(NULLIF(email, ''), '[email protected]') FROM users WHERE id=1000000; 
+6

Simple, élégant, puis beaucoup plus facile d'autres solutions, et me permet encore d'utiliser 'COALESCE '! –

+0

@John Merci, appréciez vos commentaires. –

+0

charmant. cherchait une solution qui fonctionne en H2, celle-ci aussi! – thrau

0

Cela a fonctionné pour moi:

SELECT IF(myValue > 0, myValue, 'empty string') AS Value FROM myTable; 
Questions connexes