【问题标题】:mysql - function like isnull() to check for zero-valuemysql - 像 isnull() 这样的函数来检查零值
【发布时间】:2012-05-02 02:01:12
【问题描述】:

我正在寻找一个函数来检查列的值是否为 0,其行为类似于 isnull() 函数。

这是我目前得到的:

CONCAT(
    SUBSTRING_INDEX(
        SUBSTRING(textCol, 1, 
            LOCATE(DATE_FORMAT(dateCol,'%d.%m.%Y  %H:%i'), textCol)-1),
            '|',
             -1),       
    SUBSTRING(
        textCol,
        LOCATE(DATE_FORMAT(dateCol,'%d.%m.%Y  %H:%i'), textCol),
        IFNULL(
            LOCATE( /* this will return 0 if it's the last entry */
                '|', 
                textCol, 
                LOCATE(DATE_FORMAT(dateCol,'%d.%m.%Y  %H:%i'), textCol)
            ) - LOCATE(DATE_FORMAT(dateCol,'%d.%m.%Y  %H:%i'), textCol),
            LENGTH(textCol))))

textCol 中的数据有点像一个 CSV 文件,每列内都有另一个 CSV 文件。每个数据集由| 分隔,而其中的每个数据集由&& 分隔。内部字段是名称、日期(如'%d.%m.%Y %H:%i')和评论。

我想提取与我在dateCol 中的某个 DATETIME 对应的数据集。问题是,如果我要查找的是textCol 中的最后一个条目,则LOCATE(请参阅注释)返回0。但这会破坏我的SUBSTRING,因此只返回条目的前半部分。

我添加了一个ISNULL(),当然这里没有任何作用。我想做的是有一些类似于ISNULL() 的东西,类似于ISZERO(),就像Perl 中的|| 运算符的行为一样。

可能有更好的方法来实现我想要的。请不要犹豫告诉我。

【问题讨论】:

    标签: mysql substring zero isnull


    【解决方案1】:

    这样更短,避免重复表达:

    SELECT COALESCE( NULLIF( expression, 0 ), 'a substitute for zero' ) FROM mytable
    

    【讨论】:

    • NULLIF 是个好主意
    【解决方案2】:

    在这里可能有用:有一种时髦的方法来检查表达式是否为 NULL 0:

    IFNULL(NULLIF(expr, 0), alt_expr)
    

    如果 expr 为 NULL 或 0,则返回 alt_expr,否则返回 expr

    【讨论】:

    • 这是最好的答案
    【解决方案3】:
    SELECT  CASE expression WHEN 0 THEN 'a substitute for zero' ELSE expression END
    FROM    mytable
    

    【讨论】:

    • 谢谢。那会奏效。我已经考虑过SELECT IF(expression = 0, 'a substitute for zero', expression) 也是如此。不过,就我而言,这两种情况都相当冗长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多