Что означает этот 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
Я признаю, что последняя часть никогда не сделает ничего, и, возможно, я просто педантичен, но для меня это более точно описывает ваш запрос.