Выражение обращения с помощью T-SQL

#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.