2014-11-05 10 views
0

У меня есть таблица «Маршрут» с столбцами Id, Name и Active. Если Id = 0, я хочу выбрать все идентификаторы, где Active = true.Оператор case в выражении WHERE в SQL

Если Id> 0, я хочу выбрать данные для определенного Id, где Active = true.

Я пробовал со следующим запросом. Но не работает. (здесь я прошел 2 для значения Id.) Может кто-нибудь меня поддержать?

DECLARE @ID INT 
SET @ID = 2 

SELECT DISTINCT Id ,Name 
FROM Route 
WHERE 
CASE WHEN @ID > 0 
THEN Id = @ID AND Active= 1 
ELSE 
Active=1 
END 

Образец данных прилагается.

enter image description here

+0

Я попробовал. Но не удалось – Tom

+0

Является '' '' '' строковым полем ('' True'') или целочисленным полем ('1')? –

+0

Active - это поле Boolian. – Tom

ответ

2

Нет необходимости использовать дело можно сделать, используя только там, где положение.

DECLARE @ID INT 
SET @ID = 2 

SELECT DISTINCT Id ,Name 
FROM Route 
WHERE Active=1 AND (Id = @Id OR @Id = 0); 

Объяснение:

WHERE 
CASE WHEN @ID > 0 
THEN Id = @ID AND Active= 1 
ELSE 
Active=1 

а. если @ID> 0, то Id = @ID И Active = 1

b. еще Active = 1

Если вы посмотрите в обоих случаях близко, Active = 1 остается одинаковым в обоих случаях, так что могут быть приняты безопасно снаружи условия

Тогда оставшаяся часть, если @ID> 0 то Id = @ID, т.е. выберите строку в соответствии с значением параметра, когда параметр имеет действительное значение, в противном случае выберите все.

Итак, если объединить обе становится

WHERE Active=1 AND (Id = @Id OR @Id = 0); 
+0

Да, проверьте, дает ли он вам желаемый результат. В противном случае вы можете предоставить образцы данных и ожидаемые результаты. Так что мы можем проверить – Satyajit

+0

Здесь даже если я передаю 3 для Id еще все данные, показывающие. – Tom

+0

Неверный синтаксис рядом с '='. – Tom

Смежные вопросы