1

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

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

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

4

2 回答 2

2

您的查询是:

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

查询在进行任何更改之前update确定它正在执行的行的数量。所以,最后一行是在是or的地方。然后将这些行设置为。换句话说,该子句充当要修改的行的过滤器。具体语句是保留值为或的行。ProcessedNULL0updateProcessed1whereProcessedNULL0

于 2013-08-05T18:26:43.093 回答
0

COALESCE功能在这里描述: http ://technet.microsoft.com/en-us/library/ms190349.aspx

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

于 2013-08-05T19:03:03.013 回答