【问题标题】:SQL Server Coalesce conditionSQL Server 合并条件
【发布时间】:2013-08-05 18:23:50
【问题描述】:

我有这段代码,我不确定它是如何工作的:

UPDATE Data
    SET Processed = 1
FROM Data
JOIN Meters
    ON Meters.ServiceAccount = serv_acct
where COALESCE(Processed, 0) = 0

我的问题是关于最后一行的!在这种情况下,这条线会是真的吗? 由于我将 Processed 设置为 1 那么它将如何工作: where COALESCE(Processed, 0) = 0?

谁能解释以这种方式使用 Coalesce 的逻辑?

这段代码不是我写的。 谢谢

【问题讨论】:

    标签: sql sql-server coalesce


    【解决方案1】:

    您的查询是:

    UPDATE Data
        SET Processed = 1
        FROM Data JOIN
             Meters
             ON Meters.ServiceAccount = serv_acct
        where COALESCE(Processed, 0) = 0;
    

    update 查询确定它在在进行任何更改之前所作用的行数。所以,最后一行是ProcessedNULL0 的行。然后,update 将这些行的 Processed 设置为 1。换句话说,where 子句充当要修改的行的过滤器。具体语句是保留Processed的值为NULL0的行。

    【讨论】:

    • 如果我有这个会发生什么: where COALESCE(1, 0) = 0;这甚至会加入吗?由于条件不匹配。
    • @HotlansyHttlandy 。 . . coalesce() 返回参数列表中第一个非 NULL 值的值。所以,coalesce(1, 0) = 0 总是错误的。在连接的上下文中,没有行会匹配。
    【解决方案2】:

    COALESCE 函数如下所述: http://technet.microsoft.com/en-us/library/ms190349.aspx

    我认为使用这个谓词where COALESCE(Processed, 0) = 0 背后的原因是过滤所有列Processed 为NULL 或等于0 的行。

    相反,我会使用 use 谓词:

    UPDATE Data
    SET Processed = 1
    FROM Data JOIN
        Meters 
        ON Meters.ServiceAccount = serv_acct
    where Processed IS NULL OR Processed = 0;
    

    因为它们是 SARGable。这意味着Index Seek

    Processed 列上应用表达式将强制 SQL Server 选择 [Clustered] Index Scan

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多