【发布时间】:2011-05-05 07:59:44
【问题描述】:
我知道 coalesce 将返回传递给它的第一个非空值。有没有类似的东西会返回第一个非空/非假值?
示例:
select FunctionIWant(0,'','banana') as fruit; //returns banana.
【问题讨论】:
我知道 coalesce 将返回传递给它的第一个非空值。有没有类似的东西会返回第一个非空/非假值?
示例:
select FunctionIWant(0,'','banana') as fruit; //returns banana.
【问题讨论】:
使用 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
【讨论】:
MySQL 中没有这样的函数,但是你可以开发自己的存储函数。这里的主要困难是传递给函数的参数数量可能会有所不同。
一种可能的解决方案是使用CONCAT_WS 函数(请参阅CONCAT_WS() function)传递一个字符串,其中包含一组由分隔符分隔的值。您还必须定义一个字符串分隔符,以防您的分隔符包含在该集合的某个值中。
这是一个示例脚本:
分隔符 |; 创建函数 MY_COALESCE ( p_set_string TEXT ,p_delimiter CHAR(1) ) 返回文本 确定性 开始 返回 SUBSTRING_INDEX(SUBSTRING_INDEX( 替换(替换( 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) ; 结尾; |; 分隔符; SET @separator=',', @delimiter='$'; 选择 MY_COALESCE( CONCAT_WS(CONCAT(@delimiter,@separator,@delimiter),0,'','banana') ,@分隔符 ) 作为水果 ;运行之前的脚本时,您会得到以下输出:
MySQL> -------------- MySQL> SET @separator=',', @delimiter='$' MySQL> -------------- MySQL> MySQL> 查询正常,0 行受影响(0.00 秒) MySQL> MySQL> -------------- MySQL>选择 MySQL> MY_COALESCE( MySQL> CONCAT_WS(CONCAT(@delimiter,@separator,@delimiter),0,'','banana') MySQL> ,@delimiter MySQL>) 作为水果 MySQL> -------------- MySQL> MySQL> +--------+ MySQL> |水果| 高分辨率照片| CLIPARTO MySQL> +--------+ MySQL> |香蕉| 高分辨率照片| CLIPARTO MySQL> +--------+ MySQL> 1 行(0.02 秒)您当然可以调整字符串分隔符的值,这样就不会与您的设置值发生任何冲突。
【讨论】:
您可以在 MySQL 中将空字符串设为 NULL:
SELECT coalesce(NULLIF(email, ''), 'user@domain.com') FROM users WHERE id=1000000;
【讨论】:
COALESCE!
这对我有用:
SELECT IF(myValue > 0, myValue, 'empty string') AS Value FROM myTable;
【讨论】: