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;