SQL Server Coalesce条件

时间:2013-08-05 18:23:51

标签: sql sql-server coalesce

我有这段代码,我不知道它会如何工作:

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的逻辑吗?

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

2 个答案:

答案 0 :(得分:2)

您的查询是:

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

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

答案 1 :(得分:0)

此处描述了COALESCE功能: http://technet.microsoft.com/en-us/library/ms190349.aspx

我认为使用此谓词where COALESCE(Processed, 0) = 0的原因是过滤所有列Processed IS 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