mysql - 使用类似isnull()的函数来检查零值

4

我正在寻找一个函数来检查列的值是否为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()的东西,它类似于Perl中的||运算符。

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

3个回答

16

这里可能会有用:有一种奇妙的方法可以检查表达式是否为 NULL 或者 0:

IFNULL(NULLIF(expr, 0), alt_expr)

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

这是最好的答案。 - Kalpesh Popat

10

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

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

NULLIF是一个很好的想法。 - Yevgeniy Afanasyev

3
SELECT  CASE expression WHEN 0 THEN 'a substitute for zero' ELSE expression END
FROM    mytable

1
谢谢。那个可以用。我已经考虑过 SELECT IF(expression = 0, 'a substitute for zero', expression),它也是一样的。但在我的情况下,这两种情况都相当长。 - simbabque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接