MySQL,合并等价于空值?

我知道coalesce会返回传递给它的第一个非null值。 有没有什么simlilar会返回第一个不是空的/不是假的值?

例:

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

使用ANSI CASE语句/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 

你可以从MySQL中的空string中取NULL:

 SELECT coalesce(NULLIF(email, ''), 'user@domain.com') FROM users WHERE id=1000000; 

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

一种可能的解决scheme是使用CONCAT_WS函数(参见CONCAT_WS()函数 )传递由分隔符分隔的一组值的string。 您还必须定义一个string分隔符,以防您的分隔符包含在集合的其中一个值中。

这是一个示例脚本:

 DELIMITER |;
 CREATE FUNCTION MY_COALESCE(
      p_set_string文本
     ,p_delimiter CHAR(1)
   )返回文本
    确定性
开始

     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)
     ;
结束;
 |;
 DELIMITER;

 SET @ separator =',',@delimiter ='$';
select
   MY_COALESCE(
       CONCAT_WS(CONCAT(@定界符,@分离器,@定界符),0, '', '香蕉')
      @分隔符
     )作为水果
 ;

运行以前的脚本时,会得到以下输出:

 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>,@分隔符
 MySQL>)作为水果
 MySQL> --------------
 MySQL的> 
 MySQL> + -------- +
 MySQL> | 水果|
 MySQL> + -------- +
 MySQL> | 香蕉|
 MySQL> + -------- +
 MySQL> 1行(0.02秒)

您当然可以调整string分隔符的值,以免与您的设置值产生冲突。

这对我工作:

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