2012-02-21 5 views
0

У меня возникли проблемы с использованием CASE при попытке вернуть соответствующие результаты в зависимости от того, передано ли определенное значение.Использование CASE в SQL Server 2008

Например, я хотел бы выполнить запрос, если пригород передается

WHEN @suburb <> '' THEN 
@suburb 
END 
= [Suburb] 
AND 
[City] = @city 

Однако, как я только запустить запрос, так что, когда нет пригорода не передается он использует только город?

Должен ли я писать запрос следующим образом?

WHERE 
(
    [Suburb] = @suburb 
    AND 
    [City] = @city 
) 
OR 
(
    [City] = @city 
) 
+0

Я определенно не буду писать его во второй форме. –

+0

@ Аарон Бертран - Почему бы не порекомендовать написать его во втором? – PeanutsMonkey

+0

Потому что зачем повторять статью 'City = @ city' дважды? –

ответ

1

Вы действительно не нужно CASE:

WHERE (suburb = @suburb OR @suburb = '' OR @suburb IS NULL) AND city = @city 
+0

Это работало как шарм. Вопрос, хотя я новичок в SQL. Я предполагаю, что оператор OR выполняется только в том случае, если первое условие не выполнено, например. если 'suburb = @ suburb' не имеет значения, то он переходит к процессу' @suburb = '' '. Правильно? – PeanutsMonkey

+1

Нет, SQL не замыкается. Все выражения оцениваются. –

+0

Статья на http://weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspx кажется, что она делает это, если я не понял. Если оценивать все условия, можно ли предположить, что все эти условия могут быть выполнены? – PeanutsMonkey

1

Так как вы используете SQL Server 2008, вы хотите использовать OPTION (RECOMPILE) намек здесь, чтобы избежать кэширования несоответствующий плана. См. Catch-all queries для более подробной информации.

... 
WHERE ((@suburb = '') OR (@suburb <> '' AND [Suburb] = @suburb)) 
    AND [City] = @city 
OPTION (RECOMPILE) 
+0

+1 для решения проблем с параметрами sniffing –

1

Есть несколько альтернативных способов достижения, вы можете попробовать один из них ..

WHERE [City] = @city 
AND ([Suburb] = @suburb OR '' = '') 
0
SELECT FirstName, LastName, TelephoneNumber, "When to Contact" = 
CASE 
     WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time' 
     ELSE TelephoneSpecialInstructions 
END 

ОТ Person.vAdditionalContactInfo;