2014-10-28 2 views
0

Я пытался опробовать некоторые случайные вещи, используя аргумент case, когда я наткнулся на этот сценарий. Первый оператор выдает ошибку, но второй работает нормально. Может ли кто-нибудь помочь мне понять выполнение инструкции CASE здесь.Неожиданный вывод при использовании оператора CASE

SELECT CASE WHEN 1 = 1 THEN 'case 1' 
      WHEN 2 = 2 THEN 2 
      ELSE 10 END 

SELECT CASE WHEN 1 = 1 THEN 1 
      WHEN 2 = 2 THEN 'case 2' 
      ELSE 10 END 

ответ

1

Когда оператор объединяет два выражения различных типов данных, правила для данных типа старшинства указать, что тип данных с более низким приоритетом преобразуется в тип данных с более высоким приоритетом. Если преобразование не поддерживается неявным преобразованием, возвращается ошибка (MSDN).

INT имеет более высокий приоритет, чемvarchar поэтому он пытается convert «случае 1» int.

Попробуйте это и будет получить выход

SELECT case when 1=1 then 'case 1' when 2=2 then '2' else '10' END 

SELECT case when 1=1 then 1 when 2=2 then 'case 2' else 10 END 

для более подробного объяснения check here

для типа данных старшинства check here

1

Всех типов вашего возвращаемого значения должна быть одинаковым Read Here

Вы также можете увидеть в ссылке еще одну ссылку, которая обсуждает приоритет, чтобы определить, какой тип sql будет использовать в случае case. И в вашем случае тип используется в том смысле, что он имеет более высокий приоритет, чем текст.

Вторая команда работала, потому что выполнено первое условие. но если вы попытаетесь сделать его ложным, как «SELECT case, когда 1 = 2, затем 1, когда 2 = 2, затем« случай 2 »еще 10 END». Он будет иметь ту же ошибку, что и команда 1, потому что он будет оценивать условие 2 как true с текстом возвращаемого типа, который нарушает правило для подобных типов.

Короче говоря, ошибка вызвана не имеющих один и тот же

2

Случай утверждение не может возвращать более одного типа. Когда существует сочетание типов, таких как int и varchar, тип int имеет более высокий приоритет и поэтому будет выбранным типом для возвращаемого типа ваших операторов case. См. http://msdn.microsoft.com/en-us/library/ms190309.aspx для списка приоритетов типа данных.

Ваш второй аргумент case завершится неудачно, если вы попытаетесь вернуть второе значение ('case 2'); например, с:

SELECT case when 1=0 then 1 when 2=2 then 'case 2' else 10 END 
Смежные вопросы