2010-07-29 26 views
7

我在SQL Server 2008數據庫上有一個應用程序。這個數據庫有一個查詢其中一個表的存儲過程。此存儲過程需要兩個參數:userName和ID在SQL中有條件地執行WHERE子句

userName參數將始終通過。但是,ID字段將爲NULL或實際值。如果該值不是NULL,我需要在我的查詢的WHERE子句中考慮它。不幸的是,我不積極如何做到這一點。目前,我正在嘗試

SELECT 
    * 
FROM 
    TaskTicket t 
WHERE 
    t.[UserName][email protected] AND 
    -- This is where I am stumped 

謝謝你的幫助!

回答

10
SELECT 
* 
FROM 
TaskTicket t 
WHERE 
t.[UserName][email protected] 
AND (@ID IS NULL OR t.[ID] = @ID) 
2
SELECT 
    <column list> 
FROM 
    TaskTicket T 
WHERE 
    T.[UserName] = @username AND 
    (T.id = @id OR @id IS NULL) 

要知道,這可能會導致在某些情況下,非最佳查詢計劃。在這種情況下,這可能不是什麼大問題,除非您的表格很大,並且您沒有UserName和ID上的索引。

3

試試這個:

SELECT 
    * 
FROM 
    TaskTicket t 
WHERE 
    t.[UserName][email protected] AND 
    (@ID is null 
    or -- replace this comment with your logic 
) 
3

集團的條件語句一起

select * 
from TaskTicket t 
Where t.[UserName][email protected] AND 
    ((t.Id is null and (conditions_when_id_is_null)) 
    or 
    (t.Id is not null and (conditions_when_id_is_not_null))) 
0
Create procedure Procedure1 
( 
@Param1 nvarchar(100)=null,  
)  
AS  
BEGIN  
    SELECT  
    ColumnName1,ColumneName2 
    FROM TableName 
    WHERE  
    (@Param1 IS NULL OR [email protected]) 
END 
1

比使用OR條件的希望​​更高效:

SELECT 
    * 
FROM 
    TaskTicket t 
WHERE 
    t.[UserName][email protected] AND 
    t.[ID] LIKE COALESCE(@ID,'%') 

注:只會工作,如果ID是一個不可空的字符cter字段。 (否則,您可以在[[ID]上使用CAST和COALESCE,但不可能比OR條件更有效。)

或者,在存儲過程中使用動態SQL來完全省略t。[ID ]條件,如果@ID爲NULL。

+0

都適用於我 - (動態或使用'%')。我使用的一個變體有時是@ID參數是可選的,默認爲'%',它基本上和你的where子句中的coalesce做同樣的事情。 – dave 2010-07-29 16:13:42

1
declare @SQL nvarchar(max) 
declare @WHERE_ID nvarchar(20) 
set @WHERE_ID = 
(
CASE 
    WHEN @ID is null THEN '' 
    ELSE ' AND ID = ' + CAST(@ID as nvarchar(10)) 
END 
) 

set @SQL = 'SELECT * FROM TaskTicket WHERE UserName = ' + @userName + @WHERE_ID 

EXEC @SQL