2013-08-05 6 views
1

У меня есть этот кусок кода, который я не знаю, как она будет работать:SQL Server Coalesce состояние

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

Мой вопрос о последней строке! Будет ли эта линия когда-либо быть правдой в этом случае? Поскольку я настраиваю Обработать до 1, то как это будет работать: where COALESCE(Processed, 0) = 0?

Может ли кто-нибудь объяснить логику использования Coalesce таким образом?

Этот код не написан мной. Спасибо

ответ

2

Вашего запроса:

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

update запросы определяют популяцию строк она действует на , прежде какие-либо изменения сделаны. Итак, последняя строка берет строки, где Processed либо NULL, либо 0. Затем update устанавливает Processed на 1 для этих строк. Другими словами, предложение where действует как фильтр для строк для изменения. Конкретным утверждением является сохранение строк, где значение Processed равно NULL или 0.

+0

Что произойдет, если у меня есть: где COALESCE (1, 0) = 0; Будет ли это даже делать соединение? Поскольку условие не соответствует. –

+0

@HotlansyHttlandy. , , 'coalesce()' возвращает значение первого значения, отличного от NULL, в списке аргументов. Итак, 'coalesce (1, 0) = 0' всегда ложно. В контексте объединения никакие строки не будут совпадать. –

0

COALESCE функция описана здесь: http://technet.microsoft.com/en-us/library/ms190349.aspx

Я думаю, что причина использования этого предиката where COALESCE(Processed, 0) = 0 был отфильтровать все строки, которые имеют столбец Processed IS NULL или равно 0.

Вместо этого, я бы предикаты использования:

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.

Смежные вопросы