2014-02-11 2 views
0

У меня есть случай, когда заявления в запросе экстракта, который не кажется, возвращающимся то, что я ожидалДела не правильно оценивать SQL сервера

DECLARE @Val1 int, @Val2 int,@Val3 int, @Val4 int, @Val5 int 

SELECT @Val1 = 5 , @Val2= 2,@Val3= 200000, @Val5 = 2,@Val4 = 2014 
SELECT @Val1 , @Val2,@Val3, @Val4, @Val5 

SELECT CASE 

     WHEN @Val1 = 5 AND @Val2 IN(1,2) AND @Val3 = 200000 AND @Val4 IS NULL THEN 'ReturnValue1' 
     WHEN @Val1 = 5 AND @Val2 IN(1,2) AND @Val3 = 200000 AND @Val4 IS NOT NULL THEN 'ReturnValue2' 
     WHEN @Val1 = 5 AND @Val2 = 2 AND @Val3 = 200000 AND @Val5 = 2 AND @Val4 IS NOT NULL THEN 'ReturnValue3' 
     ELSE NULL 
    END [TestingValue] 

Я ожидаю, что значение будет ReturnValue3 однако, по всей видимости, это игнорирует всю эту строку.

Может ли кто-нибудь увидеть проблему, которую я не обнаруживаю.

+0

Когда более чем один случай верно будет возвращать первый один – Mihai

+0

я заметил, что если поместить последнюю строку в верхней части он тогда работал, но думал, что мне не хватает что-то другое. Итак, чтобы получить это правильно, хотя последнее, когда оператор имеет дополнительное значение для проверки SQL Server, игнорирует это? – Gelder

+0

Он останавливается с первым истинным состоянием, да. – Mihai

ответ

4

В большинстве случаев

Оператор СЛУЧАЙ оценивает свои условия последовательно и останавливает с первым условием которого условие выполнено

http://msdn.microsoft.com/en-us/library/ms181765.aspx

+0

[Нет, это не всегда так) (http://dba.stackexchange.com/questions/12941/does-sql-server-read-all-of-a-coalesce-function-even-if-the-first -argument-нет-нет/12945 # 12945). –

1

ReturnValue3 является подмножеством ReturnValue2, следовательно, вам нужно сначала проверить ReturnValue3, иначе все комбинации, которые удовлетворяли бы ReturnValue3, будут назначены ReturnValue2.

DECLARE @Val1 int, @Val2 int,@Val3 int, @Val4 int, @Val5 int 

SELECT @Val1 = 5 , @Val2= 2,@Val3= 200000, @Val5 = 2,@Val4 = 2014 
SELECT @Val1 , @Val2,@Val3, @Val4, @Val5 

SELECT CASE 
     WHEN @Val1 = 5 AND @Val2 IN(1,2) AND @Val3 = 200000 AND @Val4 IS NULL 
     THEN 'ReturnValue1' 
     WHEN @Val1 = 5 AND @Val2 = 2 AND @Val3 = 200000 AND @Val5 = 2 AND @Val4 IS NOT NULL 
     THEN 'ReturnValue3' 
     WHEN @Val1 = 5 AND @Val2 IN(1,2) AND @Val3 = 200000 AND @Val4 IS NOT NULL 
     THEN 'ReturnValue2' 
     ELSE NULL 
    END [TestingValue] 
Смежные вопросы