我最近发现,如果值为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
?
答案 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