Что означает этот SQL-запрос?

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

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

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

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

6 ответов

Решение
select AuditStatusId 
from dbo.ABC_AuditStatus 
where AuditFrequency  <> 0 and AuditFrequency  is not null

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

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

WHERE COALESCE(AuditFrequency, 0) != 0

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

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

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


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

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 или нулю.

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

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

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

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

Другие вопросы по тегам