No hay tal función en MySQL, pero se puede desarrollar su propia función almacenada. La principal dificultad aquí es que la cantidad de parámetros para pasar a la función puede variar.
Una posible solución podría ser pasar una cadena con un conjunto de valores separados por un separador utilizando la función CONCAT_WS
(consulte CONCAT_WS() function). También debería definir un delimitador de cadena en caso de que su separador se incluya en uno de los valores del conjunto.
Aquí es un script de ejemplo:
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
;
Cuando se ejecuta la secuencia de comandos anterior se obtiene el siguiente resultado:
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)
Por supuesto, puede adaptar el valor del delimitador de serie por lo que ganó' Hay conflictos con tus valores establecidos.
simple, elegante, mucho más fácil que otras soluciones, y todavía me permite usar 'COALESCE '! –
@John Gracias, aprecia tus comentarios. –
precioso. estaba buscando una solución que funciona en H2, ¡esta también! – thrau