Что означает этот SQL-запрос? - PullRequest
1 голос
/ 07 июля 2010

У меня следующий запрос SQL:

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

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

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

Ответы [ 6 ]

13 голосов
/ 07 июля 2010
select AuditStatusId 
from dbo.ABC_AuditStatus 
where AuditFrequency  <> 0 and AuditFrequency  is not null

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

5 голосов
/ 07 июля 2010

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

WHERE COALESCE(AuditFrequency, 0) != 0

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

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

0 голосов
/ 07 июля 2010

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


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

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
      );

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

0 голосов
/ 07 июля 2010

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

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

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

0 голосов
/ 07 июля 2010

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

0 голосов
/ 07 июля 2010

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

...