MySQL,合并空值的等价物?

时间:2010-11-04 21:26:35

标签: sql mysql

我知道coalesce将返回传递给它的第一个非null值。是否有类似的东西将返回第一个非空/非假值?

示例:

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

4 个答案:

答案 0 :(得分:148)

您可以在MySQL中使用空字符串设置NULL:

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

答案 1 :(得分:12)

使用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

答案 2 :(得分: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)

您当然可以调整字符串分隔符的值,这样就不会与您的设置值产生任何冲突。

答案 3 :(得分:0)

这对我有用:

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