2009-07-23 53 views
1

我想知道如果有一種方法不執行我的子查詢如果我的ID1爲NULL?SQL子查詢不執行,如果爲空

CREATE PROCEDURE [dbo].[TestTable_Search] 
    @Col1 int, 
    @Col2 uniqueidentifier, 
    @Col3 datetime, 
    @Col4 datetime, 
    @ID1 varchar(10) 
AS 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

SELECT * 

FROM 
    [dbo].[TestTable] 
WHERE 
    [Col1] = COALESCE(@Col1, Col1) AND 
    [Col2] = COALESCE(@Col2, Col2) AND 
    [Col3] >= COALESCE(@Col3 + "00:00:00", Col3) AND 
    [Col4] <= COALESCE(@Col4 + "23:59:59", Col4) AND 
    [Col5] IN (SELECT [ID2] FROM [dbo].[TestTable2] WHERE [ID1] = @ID1) 

回答

2

不知道你的意思,但也許這是你在找什麼:

SELECT * 
FROM 
    [dbo].[TestTable] 
WHERE 
    [Col1] = COALESCE(@Col1, Col1) AND 
    [Col2] = COALESCE(@Col2, Col2) AND 
    [Col3] >= COALESCE(@Col3 + "00:00:00", Col3) AND 
    [Col4] <= COALESCE(@Col4 + "23:59:59", Col4) AND (
    @ID1 IS NULL 
     OR [Col5] IN (SELECT [ID2] FROM [dbo].[TestTable2] WHERE [ID1] = @ID1)) 
+0

更快的比我.... – RolandTumble 2009-07-23 16:59:29

+0

優秀的正是我一直在尋找... + 1 – Gabe 2009-07-23 17:19:56

0

如果您不執行子查詢,則不會返回任何行。因此,只要處理這種情況下有獨立的選擇,像這樣:

IF @ID1 IS NULL 
BEGIN 

    SELECT * 
    FROM dbo.[TestTable] 
    WHERE 1 = 0 

END 
ELSE 
BEGIN 

    SELECT * 

    FROM 
     [dbo].[TestTable] 
    WHERE 
     [Col1] = COALESCE(@Col1, Col1) AND 
     [Col2] = COALESCE(@Col2, Col2) AND 
     [Col3] >= COALESCE(@Col3 + "00:00:00", Col3) AND 
     [Col4] <= COALESCE(@Col4 + "23:59:59", Col4) AND 
     [Col5] IN (SELECT [ID2] FROM [dbo].[TestTable2] WHERE [ID1] = @ID1) 

END 
1

SQL Server不處理非常好OR條件,特別是變量,這就是爲什麼這可能將是最好的決定:

SELECT * 
FROM [dbo].[TestTable] 
WHERE [Col1] = COALESCE(@Col1, Col1) AND 
     [Col2] = COALESCE(@Col2, Col2) AND 
     [Col3] >= COALESCE(@Col3 + "00:00:00", Col3) AND 
     [Col4] <= COALESCE(@Col4 + "23:59:59", Col4) AND 
     AND @id1 IS NULL 
UNION ALL 
SELECT * 
FROM [dbo].[TestTable] 
WHERE [Col1] = COALESCE(@Col1, Col1) AND 
     [Col2] = COALESCE(@Col2, Col2) AND 
     [Col3] >= COALESCE(@Col3 + "00:00:00", Col3) AND 
     [Col4] <= COALESCE(@Col4 + "23:59:59", Col4) AND 
     [Col5] IN (SELECT [ID2] FROM [dbo].[TestTable2] WHERE [ID1] = @ID1) 

如果@idNULL,由於過濾器,第一個子查詢將不返回任何內容。

如果@idNULL,第二子查詢將返回任何結果,因爲相比於NULL永遠不匹配,內部子查詢將返回一個空集,col5 IN (SELECT …)將永遠不會滿足。

SQL Server可以在運行時高效地檢測這些事件,這就是爲什麼第一個第二個子查詢幾乎可以立即被優化。

請參閱本文中我的博客的OR性能比較反對UNION ALL