1

我最近发现,如果值 where ,查询将无法对我的某些记录起作用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

4

6 回答 6

4

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

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

于 2012-05-21T21:47:39.290 回答
2

使用合并:

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'
于 2012-05-21T21:46:45.280 回答
2

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

于 2012-05-21T21:53:19.473 回答
1

检查 null 的正确方法是MyField IS NULL. 正如您正确指出的那样,直接比较null是行不通的。

于 2012-05-21T21:46:09.307 回答
1

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

select ...
where ...
and column is not null
于 2012-05-21T21:46:19.603 回答
1

警告:我不是 mysql 人,而是 TSQL 人。首先,对您的一个条件更新语句的一般逻辑进行评论:当您第一次检查“已查看”以获取特定值时,如果“已查看”不是该值,则将其设置为该值,您比必要的。

我的意思是,如果您知道您希望 ID 为 3024 的所有记录对“已查看”列具有相同的时间戳,然后,首先检查列中的任何值并仅更新那些不匹配的值,不需要,额外的工作也是如此。如果您的意图是所有“已查看”(其中 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 语句中使用“或”和/或“合并”,这样空值就不会被忽略。通过将 OR 与 IS NULL 结合使用和/或与非空默认值合并,您可以强制更新任何空值。(在您的特定示例中,使用默认值为 0 的合并,将具有将“trendingViews”列中的先前空值设置为 1 的效果,因为您递增 1,并且您将使用 0 作为默认值对于空实例。)

例子:

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

更新语句的第一行...设置“视图”的部分让我感到困惑,因为我不知道您的意图是检查名为“视图”的列/字段是否存在,或者您是否试图检查该“视图”列中的值是否为非空。如果您的目标是检查它是否不为空,然后在这种情况下将其增加 1,如果它为空,则将其设置为 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
于 2012-05-21T23:06:10.297 回答