我知道coalesce将返回传递给它的第一个非null值。是否有类似的东西将返回第一个非空/非假值?
示例:
select FunctionIWant(0,'','banana') as fruit; //returns banana.
答案 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;