2010-11-04 71 views
42

我知道coalesce会返回传递给它的第一个非空值。有没有什么simlilar会返回第一个不是空的/不是虚假的值?MySQL,合并等价于空值?

例如:

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

回答

7

使用ANSI CASE statement/expression

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

有没有布尔在SQL或MySQL。 MySQL实际上将该值存储为INT,值为零或一:

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

在MySQL中没有这样的函数,但是您可以开发自己的存储函数。这里的主要困难是传递给函数的参数数量可能会有所不同。

一种可能的解决方案是使用CONCAT_WS函数(请参阅CONCAT_WS() function)将字符串传递给由分隔符分隔的一组值。您还必须定义一个字符串分隔符,以防您的分隔符将包含在集合的其中一个值中。

下面是一个示例脚本:

 
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 
; 

当运行前面的脚本将得到以下的输出:

 
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) 

当然你可以适应字符串分隔符的价值所以赢得了”不要与你的设定值发生任何冲突。

113

你可以把从空字符串NULL在MySQL:

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

简洁,美观,更容易然后其他的解决方案,而且还允许我使用'COALESCE '! – 2012-05-23 14:31:19

+0

@John谢谢,感谢您的反馈。 – 2012-05-26 20:29:31

+0

可爱。正在寻找一种可以在H2中使用的解决方案,这也是一种解决方案! – thrau 2013-03-04 01:12:21

0

这为我工作:

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