2014-01-28 6 views
1

У меня есть следующие SQL хранимую процедуруSQL заявление СЛУЧАЯ для булевых значений

@Text varchar(max), 
@isArchived varchar(10) 

SELECT * 
    FROM [Table1] 
    WHERE [StringText] = @ AND [isArchived] = 

    (CASE 
     WHEN @isArchived = 'ALL' THEN ??? 
     WHEN @isArchived = 'Yes' THEN 1 
     WHEN @isArchived = 'No' THEN 0 
    END) 

Моя проблема заключается в том, что isArchived имеет тип бита в таблице, и на веб-странице у меня есть DropDownList с тремя значениями для isArchived : ALL, Да, нет.

для Yes это 1 (истина), для No это 0 (ложь), но не уверен, что положить в эту строку: WHEN @isArchived = 'ALL' THEN ??? идеально было бы полностью игнорировать эту строку AND [isArchived] = @isArchived но не убедитесь, что это синтаксис для этого.

ответ

2

Если вы хотите, чтобы избежать фильтрации при @isArchived = 'ALL', вы можете сравнить [isArchived] себе (до тех пор, пока значение не может быть NULL):

SELECT * 
FROM [Table1] 
WHERE [StringText] = @Text AND [isArchived] = (
    CASE 
    WHEN @isArchived = 'ALL' THEN [isArchived] 
    WHEN @isArchived = 'Yes' THEN 1 
    WHEN @isArchived = 'No' THEN 0 
    END) 

Обратите внимание, что этот вид условной фильтрации может повлиять на ваше планы выполнения, так что вы можете исследовать другой подход, как описано в этой статье:

http://www.sommarskog.se/dyn-search-2008.html

+0

Спасибо. Это и было :) Я думаю, что все должно быть хорошо, оно будет помещено в отчет SSRS. –

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