Вызывает ли SQL Server CASE выражение всех условий или выход из первого условия ИСТИНА?

Является ли оператор SQL Server (2008 или 2012, в частности) CASE оценивать все условия WHEN или завершает работу, когда находит код WHEN, которая оценивает значение true? Если он проходит через весь набор условий, означает ли это, что последнее условие, оценивающее true, перезаписывает то, что выполнило первое условие, которое оценивалось как истинное? Например:

SELECT
    CASE
        WHEN 1+1 = 2 THEN'YES'
        WHEN 1+1 = 3 THEN 'NO'
        WHEN 1+1 = 2 THEN 'NO' 
    END

Результаты «ДА», хотя последнее, когда условие должно заставить его оценивать «НЕТ». Кажется, что он выходит, как только он находит первое ИСТИННОЕ условие. Кто-нибудь может подтвердить, что это case .

38 голосов | спросил Juan Velez 29 Maypm13 2013, 22:33:24

5 ответов


41

â € ¢ Возвращает результат_выражения first input_expression = when_expression , который оценивается как TRUE .

Ссылка http://msdn.microsoft.com/en-us/library/ms181765.aspx


Это стандартное поведение SQL:

  • A CASE оценивает первое истинное условие.

  • Если нет истинного условия, он вычисляет часть ELSE.

  • Если нет истинного условия и нет ELSE, он вычисляет NULL.

ответил James Jenkins 29 Maypm13 2013, 22:36:09
14

SQL Server обычно выполняет оценку коротких замыканий для операторов CASE ( SQLFiddle ):

--Does not fail on the divide by zero.
SELECT 
   CASE 
      WHEN 1/1 = 1 THEN 'Case 1'
      WHEN 2/0 = 1 THEN 'Case 2'
   END;

--Fails on the divide by zero.
SELECT 
   CASE 
      WHEN 1/1 = 99 THEN 'Case 1'
      WHEN 2/0 = 99 THEN 'Case 2'
   END;  

Однако существует несколько типов операторов, которые с SQL Server 2012 не корректно замыкаются. См. Ссылку из ypercube в комментариях.

Oracle всегда делает оценку короткого замыкания . См. 11.2 Справочник по языку SQL . Или сравните следующее ( SQLFiddle ):

--Does not fail on the divide by zero.
SELECT
  CASE 
    WHEN 1/1 = 1 THEN 'Case 1'
    WHEN 2/0 = 1 THEN 'Case 2'
  END
FROM dual;


--Fails on the divide by zero.
SELECT
  CASE 
    WHEN 1/1 = 99 THEN 'Case 1'
    WHEN 2/0 = 99 THEN 'Case 2'
  END
FROM dual;

Этот же тест не может быть выполнен с MySQL, потому что он возвращает NULL для деления на ноль. ( SQL Fiddle )

ответил Leigh Riffel 29 Maypm13 2013, 23:07:31
6

Похоже, что MS SQL Server также использует оценку короткого замыкания.

В следующем тесте у меня есть 3 теста. Первый из них всегда верен, второй - без ссылки на таблицу, а третий терпит неудачу только при учете данных.
В этом конкретном запуске обе строки возвращаются успешно. Если я прокомментирую первое КОГДА, или первое и второе, я получаю сбои.

CREATE TABLE casetest (test varchar(10))
GO
INSERT INTO casetest VALUES ('12345'),('abcdef')
GO

SELECT CASE WHEN LEN(test)>1 THEN test
        WHEN 1/0 = 1 THEN 'abc'
        WHEN CAST(test AS int) = 1 THEN 'def'
        END
FROM casetest
GO
ответил Kenneth Fisher 30 Mayam13 2013, 00:07:35
0

, если оператор case, используемый в условии WHERE, и первый случай, когда оператор включает оценку значений столбца из таблицы, а первая строка в таблице не удовлетворяет этому условию, оператор case перейти к следующему случаю, когда оператор.

declare @tbl table(id int)
insert into @tbl values(1)
insert into @tbl values(2)
insert into @tbl values(3)

--Fails on the divide by zero.
SELECT * FROM @tbl
where  CASE 
        WHEN id = 2 THEN 1 -- first row in table will not satisfy the condition
        WHEN 2/0 = 1 THEN 1
        ELSE 0
      END =1

-- when filter the records to only who will staisfy the first case when condition, it 
will not fail on the divide by zero
SELECT * FROM @tbl
where ID=2 and -- first row in table will  satisfy the condition
  CASE 
    WHEN id = 2 THEN 1
    WHEN 2/0 = 1 THEN 1
    ELSE 0
  END =1
ответил abdelmoniem hafez 24 Jpm1000000pmSat, 24 Jan 2015 14:11:30 +030015 2015, 14:11:30
-1

В MySQL он выйдет из оператора case по первому истинному варианту. Если у вас есть возможность использовать несколько истинных значений, вы хотите разместить предпочтительный ответ раньше в последовательности.

ответил Rob 15 AMpSat, 15 Apr 2017 03:44:48 +030044Saturday 2017, 03:44:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132