如何在SQL条件子句中处理null?

时间:2012-05-21 21:43:59

标签: mysql sql null

我最近发现,如果值为null,则查询无法对我的某些记录起作用。显然在SQL中,null无法与任何内容进行比较 - 甚至null

UPDATE company SET views = IF(views, views + 1, 1),
trendingViews = IF(viewed != '2012-05-21 00:00:00', 1, trendingViews + 1),
viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed)
WHERE id = '3024'

如何更改此查询以有条件地检查提供的值和null

6 个答案:

答案 0 :(得分:3)

使用Coalesce(value1, ... valueN)isnull(value1, value2)为空字段定义备用非空值。

Coalesce将从参数列表中返回第一个NON-NULL值。如果第一个参数值为null,则Isnull将返回第二个参数值

答案 1 :(得分:2)

使用COALESCE:

UPDATE company 
SET views = COALESCE(views, 0) + 1,
    trendingViews = IF(viewed != '2012-05-21 00:00:00', 1, trendingViews + 1),
    viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed)
WHERE id = '3024'

答案 2 :(得分:2)

除了给出的其他答案外,您还可以使用NULL - 安全比较运算符<=>

答案 3 :(得分:1)

检查null的正确方法是MyField IS NULL。正确地说明,直接与null进行比较是行不通的。

答案 4 :(得分:1)

如果要排除column不为空的结果,则需要在where子句中使用is not null

select ...
where ...
and column is not null

答案 5 :(得分:1)

警告:我不是一个mysql人,但我是一个TSQL人。 首先,评论一个条件更新语句的一般逻辑:当你第一次检查'查看'时 特定值,如果'查看'不是该值,则将其设置为该值,您正在努力工作。

我的意思是,如果您知道您希望ID为3024的所有记录与“已查看”列具有相同的时间戳, 然后,首先检查FOR列中的任何值,只更新那些不匹配的值,不需要 其他工作也是如此。如果您打算将所有“已查看”(其中Id ='3024')设置为“2012-05-21 00:00:00”, 然后,只需将它们设置为该值即可。不需要考虑他们的原始价值是什么......你不在乎。

所以而不是:

viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed)
你会得到:

viewed = '2012-05-21 00:00:00'

其次,您可以在if语句中使用'或'和/或'coalesce',以便不会忽略空值。 通过对IS NULL使用OR和/或使用非null默认值进行合并,可以强制更新任何空值,无论如何。 (在您的特定示例中,使用默认值为0的coalesce,将具有在您的中设置先前空值的效果 'trendingViews'列为1,因为您递增1,并且您将使用0作为空实例的默认值。)

示例:

trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 

更新声明的第一行......设置'观看'的部分让我困惑, 因为我不知道你的意图是否要检查名为'views'的列/字段是否存在, 或者,如果您尝试检查“views”列中的值是否为非null。 如果您的目的是检查它是否为空,然后在这种情况下将其递增1,并且 如果它为null,则将其设置为1,然后就可以完成:

    views = IF(views IS NULL != 1, views + 1, 1),

所以这是我要测试的整个陈述(在MYSQL中):

UPDATE company SET 
    views = IF(views IS NULL = 0, views + 1, 1),
    trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
    viewed = '2012-05-21 00:00:00'
WHERE id = '3024';

请记住,我不使用MYSQL ....没有测试过这些MYSQL更改。 如果我在TSQL中执行此操作,则以下语句将起作用:

    UPDATE company SET 
        [views] = (CASE WHEN [views] IS NOT NULL THEN [views] + 1 ELSE 1 END),
        trendingViews = CASE WHEN viewed IS NULL OR viewed != '2012-05-21 00:00:00' THEN 1 ELSE COALESCE(trendingViews, 0) + 1 END, 
        viewed = '2012-05-21 00:00:00'
    WHERE id = '3024';
    go