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.
Simple, élégant, puis beaucoup plus facile d'autres solutions, et me permet encore d'utiliser 'COALESCE '! –
@John Merci, appréciez vos commentaires. –
charmant. cherchait une solution qui fonctionne en H2, celle-ci aussi! – thrau