2013-12-16 178 views
1

不知道我們是否可以在條件內添加if或case。在條件內添加IF/CASE語句

我試圖動態查詢中轉化爲簡單的查詢

Declare @sQuery varchar(20000) 
set @sQuery='' 

set @sQuery ='select * from #tb_user ud' 

if(@Number<>'') 
set @sQuery = @sQuery + 'and upper(ud.ID) like ''' + upper(@Number) + '%''' 

if(@Name<>'') 
set @sQuery = @sQuery + 'and upper(ud.FName) like ''' + upper(@Name) + '%''' 

Exec(@sQuery) 

注:

下面給出的查詢只是一個例子,我已經脫去我沒有得到地方如何(實際查詢有很多東西)

在此先感謝您的幫助

+0

因爲我添加了一個註釋它只是查詢的一部分〜它的一部分在Store Procedure – Malcolm

回答

1

你必須組中的OR各項測試參數爲空構造(或-inverted-您在if做任何檢查)..

SELECT 
    * 
FROM 
    #tb_user ud 
WHERE 
    (@Number = '' OR upper(ud.ID) like upper(@Number) + '%') 
    AND 
    (@Name = '' OR upper(ud.FName) like upper(@Name) + '%') 

要感謝@bartosz爲在最初的回答邏輯

+1

中如果你傳遞null參數給查詢你可以做這樣的事情WHERE upper(ud.ID)like upper (ISNULL(@Number,ud.ID))+'%' – Raphael

+2

但是這相當於動態查詢嗎?請注意,如果\ @Number =''或\ @Name ='',它將不會返回記錄,而動態查詢只會在這種情況下跳過一個或兩個ifs。 (另見我對這個問題的回答。) –

+0

@BartoszKlimek,很好的接收..你是絕對正確的。在sql組中,'if'需要被倒置。***更新的答案*** –

2

察覺的錯誤似乎你只需要使用特定的過濾器(@number或@Name),如果它不是空:

SELECT 
    * 
FROM 
    #tb_user ud 
WHERE 
    (@Number = '' OR upper(ud.ID) like upper(@Number) + '%') 
    AND 
    (@Name = '' OR upper(ud.FName) like upper(@Name) + '%')