CASE
Оценивает ли оператор SQL Server (в частности, 2008 или 2012) все WHEN
условия или он завершается, когда находит WHEN
предложение, которое оценивается как истинное? Если он проходит через весь набор условий, означает ли это, что последнее условие, оцениваемое как истинное, перезаписывает то, что выполнил первое условие, оцениваемое как истинное? Например:
SELECT
CASE
WHEN 1+1 = 2 THEN'YES'
WHEN 1+1 = 3 THEN 'NO'
WHEN 1+1 = 2 THEN 'NO'
END
Результат - «ДА», хотя последнее условие должно сделать его равным «НЕТ». Кажется, что он выходит, как только находит первое ИСТИННОЕ условие. Может кто-нибудь, пожалуйста, подтвердите, если это так .
sql-server
t-sql
case
Хуан Велес
источник
источник
COALESCE()
переводится вCASE
выражение.)Ответы:
• Возвращает result_expression первого выражения input_expression = when_expression, которое оценивается как TRUE .
Ссылка http://msdn.microsoft.com/en-us/library/ms181765.aspx
Это стандартное поведение SQL:
CASE
Выражение для первого истинного состояния.Если нет истинного условия, оно оценивается как
ELSE
часть.Если нет истинного условия и нет
ELSE
части, оно оценивается какNULL
.источник
SQL Server обычно выполняет оценку короткого замыкания для операторов CASE ( SQLFiddle ):
Однако существует несколько типов операторов, которые по состоянию на SQL Server 2012 не правильно закорачивают. Смотрите ссылку от ypercube в комментариях.
Oracle всегда выполняет оценку короткого замыкания . См. 11.2 Справочник по языку SQL . Или сравните следующее ( SQLFiddle ):
Этот же тест не может быть выполнен с MySQL, потому что он возвращает NULL для деления на ноль. ( SQL Fiddle )
источник
Похоже, что MS SQL Server также использует оценку короткого замыкания.
В следующем тесте у меня есть 3 теста. Первый из них всегда верен, второй дает сбой без ссылки на таблицу, а третий - только при учете данных.
В этом конкретном прогоне обе строки возвращаются успешно. Если я закомментирую первое КОГДА или первое и второе, то я получу неудачи.
источник
если оператор case, используемый в
WHERE
условии, и первый случай, когда оператор включает в себя оценку значений столбца из таблицы, и первая строка в таблице не удовлетворяет этому условию, оператор case перейдет к следующему оператору case при условии.источник
В MySQL он выйдет из оператора case для первого варианта true. Если у вас есть возможность нескольких истинных значений, вы хотите разместить предпочтительный ответ ранее в последовательности.
источник