#sql-server #tsql #case
#sql-сервер #tsql #обращение
Вопрос:
Я использую:
SELECT
CASE SR.[ContainerId] WHEN SR.[ContainerId] IS NULL
THEN 0
ELSE 1
END AS [IsSampleReceived]
FROM SomeTable SR where SomeCondition
Это не дает мне желаемого результата. IsSampleReceived
всегда 1
. Я не знаю почему, может быть, что-то не так WHEN SR.[ContainerId] IS NULL
.
Ответ №1:
Существует два формата использования CASE
, и вы смешиваете их вместе.
Выражение обращения имеет два формата:
Простое выражение CASE сравнивает выражение с набором простых выражений для определения результата.
Искомое выражение обращения вычисляет набор логических выражений для определения результата.
См. http://msdn.microsoft.com/en-us/library/ms181765.aspx
Вместо этого попробуйте:
select case
when SR.[ContainerId] is null
then 0
else 1
end as [IsSampleReceived]
from SomeTable SR
where SomeCondition
Ответ №2:
Почти! Вы смешивали две разные синтаксические формы:
SELECT CASE WHEN SR.[ContainerId] IS NULL THEN 0 ELSE 1 END AS [IsSampleReceived]
FROM SomeTable SR where SomeCondition
Ответ №3:
Существует два вида операторов CASE: «простой» и «поиск». В вашем коде вы комбинируете эти два вида операторов, и это дает вам неправильные результаты.
Простой:
SELECT CASE SR.[ContainerId] WHEN NULL THEN 0 ELSE 1 END AS [IsSampleReceived]
FROM SomeTable SR where SomeCondition
Искал:
SELECT CASE WHEN SR.[ContainerId] IS NULL THEN 0 ELSE 1 END AS [IsSampleReceived]
FROM SomeTable SR where SomeCondition
В вашем исходном запросе выполняется простая версия, сравнивающая значение SR.[containerId] со значением SR.[ContainerId] IS NULL
. Результат этого сравнения всегда будет false, поэтому всегда выбиралось условие else.