2010-11-04 14 views

Respuesta

7

Uso del ANSI CASE statement/expression:

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

No hay booleano en SQL o MySQL. MySQL realmente almacena el valor como, valora un INT cero o uno:

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

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.

113

Se podría hacer NULL de cadena vacía en MySQL:

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

simple, elegante, mucho más fácil que otras soluciones, y todavía me permite usar 'COALESCE '! –

+0

@John Gracias, aprecia tus comentarios. –

+0

precioso. estaba buscando una solución que funciona en H2, ¡esta también! – thrau

0

Esto funcionó para mí:

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