2012-04-25 2 views
1

Извините, что создал новый поток. Я не смог правильно задать вопрос в потоке previous.sql query - получить все записи на основе флага

У меня есть таблица в SQL Server 2008, который выглядит следующим образом -

Id  Status 
-------------- 
1  A 
2  I 
3  NULL 

У меня есть хранимая процедура, которая принимает @Status в качестве параметра.

If the @Status is "-1", I need to retrieve records 1, 2. 
If the @Status is "A", I need to retrieve only record 1. 
If the @Status is "I", I need to retrieve only record 2. 

Я хочу, чтобы иметь возможность получить записи в одном SELECT заявления без использования IF ELSE. В инструкции SELECT много соединений и вещей, и я не хочу повторять то же самое в состоянии ELSE.

Я попытался следующие, но получить неверные данные -

SELECT * FROM Person WHERE Status = @Status OR @Status IS NOT NULL 

select * from Person 
where (@Status is not null and Status = @Status) or 
     (@Status is null and Status in ('A', 'P')) 
+0

Почему вы не хотите использовать 'IF'? –

+0

@Oded: Я пробовал это - 'SELECT * FROM Person WHERE Status = @Status OR @Status IS NULL', но он возвращает неверные данные. Кроме того, этот 'select * from Person где (@Status не имеет значения null и Status = @Status) или (@Status имеет значение null и Status in ('A', 'I', 'P'))' с одинаковыми результатами , – tempid

+0

@MikaelEriksson: В операторе SELECT есть много соединений и прочее, и я не хочу повторять то же самое в состоянии «ELSE». – tempid

ответ

2

Вы можете сделать это с помощью OR:

SELECT * 
FROM Person 
WHERE Status = @Status 
OR (@Status = '-1' AND Status IS NOT NULL) 

Конечно, вы не должны использовать SELECT * в производстве код.

+0

@JohnDewey: Но тогда он вернет строку 3, если Status равен -1, что OP, похоже, не хочет. –

+0

nm, неправильно прочитайте предложение OR –

+0

+1, тогда это должно работать –

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