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

Mysql 如何处理SQL条件子句中的null?,mysql,sql,null,Mysql,Sql,Null,我最近发现,如果其中的值为null,则查询无法处理我的一些记录。显然,在SQL中,null不能与任何东西进行比较,甚至不能与null进行比较 trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 如何将此查询更改为有条件地检查提供的值和null?检查null的正确方法是MyField is null。正如您正确指出的那样,直接与

我最近发现,如果其中的值为null,则查询无法处理我的一些记录。显然,在SQL中,null不能与任何东西进行比较,甚至不能与null进行比较

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

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

检查null的正确方法是MyField is null。正如您正确指出的那样,直接与null进行比较是不起作用的。

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

select ...
where ...
and column is not null
trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
使用合并:

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'
trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
使用合并值1。。。valueN或isnullvalue1、value2为空字段定义可选的非空值

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

Coalesce将从参数列表中返回第一个非空值。Isnull将返回第二个参数值,如果第一个参数为null

除了给出的其他答案外,您还可以使用null安全比较运算符。

注意:我不是mysql人员,但我是TSQL人员。
trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
首先,对其中一个条件更新语句的一般逻辑进行评论:当您第一次选中“查看”以查看 特定值,如果“查看”不属于该值,则将其设置为该值,表示您的工作比需要的更努力

trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
我的意思是,如果您知道希望所有ID为3024的记录在“已查看”列中具有相同的时间戳, 然后,不需要首先检查列中的值,只更新不匹配的值 额外的工作也是如此。如果您打算将Id为“3024”的所有“已查看”设置为“2012-05-21 00:00:00”, 然后,将它们设置为该值。不需要考虑他们原来的价值是什么…你不在乎。< /P>
trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
因此,不是:

viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed)
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'
trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
其次,可以在if语句中使用'or'和/或'coalesce',这样就不会忽略空值。 通过使用或与IS NULL和/或与非NULL默认值合并,可以强制更新任何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), 
例如:

trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
更新声明的第一行…设置“视图”的部分让我困惑, 因为我不知道您的目的是否是检查名为“views”的列/字段的存在, 或者,如果您试图检查“视图”列中的值是否为非空。 如果您的目的是检查它是否为null,然后在这种情况下将其增加1,并且 如果为空,则将其设置为1,则可以执行以下操作:

trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
    views = IF(views IS NULL != 1, views + 1, 1),
下面是我将在MYSQL中测试的全部语句:

trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
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中执行此操作,则以下语句将起作用:

trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1), 
    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