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.
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
Vous pouvez faire NULL à partir d'une chaîne vide dans MySQL:
SELECT coalesce(NULLIF(email, ''), 'user@domain.com') FROM users WHERE id=1000000;
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.
Cela a fonctionné pour moi:
SELECT IF(myValue > 0, myValue, 'empty string') AS Value FROM myTable;