2010-07-06 4 views
1

У меня есть следующий SQL-запрос:Что означает этот SQL-запрос?

select AuditStatusId 
from dbo.ABC_AuditStatus 
where coalesce(AuditFrequency, 0) <> 0 

Я изо всех сил немного, чтобы понять это. Это выглядит довольно просто, и я знаю, что делает оператор coalesce (более или менее), но, похоже, не получает ЗНАЧЕНИЕ.

Не зная больше информации, кроме запроса выше, что вы думаете об этом?

+0

База данных сервера Sql? –

+0

Yip. MS SQL 2000/2005. –

ответ

13
select AuditStatusId 
from dbo.ABC_AuditStatus 
where AuditFrequency <> 0 and AuditFrequency is not null 

Обратите внимание, что использование Coalesce означает, что использовать этот индекс не удастся, чтобы удовлетворить этот запрос.

+4

И вы можете удалить 'и AuditFrquency не null 'в большинстве версий SQL, так как' AuditFrequency <> 0' вернет неизвестный в случае 'null'. И строки, где выражение 'where' оценивается как unkown, не возвращаются. (Единственное исключение, о котором я знаю, это SQL Server, который разрешает режим, в котором «null = null» является истинным. Это не режим по умолчанию.) –

+2

@Shannon - Хорошая точка, лишняя, хотя, возможно, более ясная. –

+0

Thnx ребята. Не думал об этом таким образом. Все еще изучая ответы и применяя их в моем контексте, чтобы понять, понимаю ли я. –

0

Похоже, что он предназначен для обнаружения нулевой точности аудита как нуля и, таким образом, скрыть эти строки.

0

Из того, что я вижу, он проверяет поля, которые не равны 0 или null.

5

COALESCE - стандартная функция ANSI для обработки значений NULL, возвращая первое значение, отличное от NULL, на основе списка с разделителями-запятыми. Это:

WHERE COALESCE(AuditFrequency, 0) != 0 

..means что если AuditFrequency столбец NULL, преобразовать значение равным нулю вместо. В противном случае возвращается значение AuditFrequency.

Поскольку сравнение не должно возвращать строки, где значение столбца AuditFrequency равно нулю, строки, в которых AuditFrequency равно NULL, также будут игнорироваться запросом.

0

Я думаю, что это более точно описывается следующим образом:

select AuditStatusId 
from dbo.ABC_AuditStatus 
where (AuditFrequency IS NOT NULL AND AuditFrequency != 0) OR 0 != 0 

Я признаю последнюю часть никогда ничего не будет делать, и, может быть, я просто быть педантичным, но для меня это более точно описывает ваш запрос.

0

Идея заключается в том, что желательно выразить одно условие поиска с помощью одного выражения, но это просто стиль, это вопрос вкуса:


одно выражения:

WHERE age = COALESCE(@parameter_value, age); 

Два выражения :

WHERE (
     age = @parameter_value 
     OR 
     @parameter_value IS NULL 
    ); 

Вот еще один пример:


одно выражение:

WHERE age BETWEEN 18 AND 65; 

Два выражения

WHERE (
     age >= 18 
     AND 
     age <= 65 
    ); 

Лично у меня есть сильные личные perference для отдельных выражений и найти их легче читать ... если я знаком с используемым шаблоном;) Выполняют ли они разные Чрезвычайно другое дело ...