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'和评论。

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

我添加了一个ISNULL(),这当然在这里没有做任何事情。我想做的是有一些类似于 do ISNULL()a的东西ISZERO(),很像||Perl 中的运算符的行为。

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

4

3 回答 3

11

这更短并且避免重复表达:

SELECT COALESCE( NULLIF( expression, 0 ), 'a substitute for zero' ) FROM mytable
于 2015-01-02T19:33:49.513 回答
8

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

IFNULL(NULLIF(expr, 0), alt_expr)

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

于 2019-03-05T21:33:37.637 回答
2
SELECT  CASE expression WHEN 0 THEN 'a substitute for zero' ELSE expression END
FROM    mytable
于 2012-04-20T13:17:30.237 回答