【问题标题】:MySQL, coalesce equivalent for empty values?MySQL,合并空值的等效项?
【发布时间】:2011-05-05 07:59:44
【问题描述】:

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

示例:

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

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

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

      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 秒)

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

      【讨论】:

        【解决方案3】:

        您可以在 MySQL 中将空字符串设为 NULL:

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

        【讨论】:

        • 简单,优雅,比其他解决方案更容易,并且仍然允许我使用COALESCE
        • @John 谢谢,感谢您的反馈。
        • 一个非常有用的方法。我在这里使用它: insert into ... on duplicate key update email= coalesce( NULLIF(email, ''), values(email) ) 现在如果数据库中有一个值,它会保留,如果没有在那里,新的被加载。
        • 太棒了,我将它用于自定义“优先级”排序并结合 FIND_IN_SET() => ORDER BY COALESCE(NULLIF(FIND_IN_SET(id,'12,45,11'), 0), 999999999 ) ASC,名称 ASC
        • 这对于 ORDER BY FIELD(mycolumn, 'A', 'B', 'C') 也很有效,您希望不匹配的值出现在最后而不是第一个。所以 ORDER BY COALESCE(NULLIF(FIELD(mycolumn, 'A', 'B', 'C'),0),999999999)。很长一段时间以来,我一直在寻找一种优雅的方式来做到这一点,就在这里。答案是多年前的,但我以前从未见过......
        【解决方案4】:

        这对我有用:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-03
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 1970-01-01
          • 2022-08-17
          • 2012-01-26
          • 2012-05-11
          相关资源
          最近更新 更多