2013-10-31 99 views
0

重複代碼的下面是表和數據反正避免了的if-else分支

CREATE TABLE #Customers 
(
    ID    INT NOT NULL, 
    ProductID  INT NOT NULL, 
    OrderID   INT NULL 
) 

INSERT INTO #Customers VALUES (1,10,1) 
INSERT INTO #Customers VALUES (2,10,NULL) 
INSERT INTO #Customers VALUES (3,10,5) 
INSERT INTO #Customers VALUES (4,20,NULL) 
INSERT INTO #Customers VALUES (5,20,NULL) 
INSERT INTO #Customers VALUES (6,20,22) 
GO 

我有哪裏的結果決定是基於一個參數@OrderID一個存儲過程。如果@OrderID不爲空,那麼它返回匹配這個參數的行,否則返回所有行。如下所示。

DECLARE @OrderID INT 
SET @OrderID = NULL 

IF @OrderID IS NULL 
BEGIN 
    SELECT * FROM #Customers 
END 
ELSE 
BEGIN 
    SELECT * FROM #Customers 
    WHERE OrderID = @OrderID 
END 

我只是想知道是否有寫WHERE子句可以涵蓋兩種情況。這樣我能避免在IF-ELSE分支

回答

1

重複的代碼,你可以在變量@ORderId是NULL的所有行會返回它寫成

 SELECT * FROM #Customers 
WHERE (OrderID = @OrderID or @OrderID is Null) 
1
DECLARE @OrderId INT = NULL 

SELECT * 
FROM #Customers c 
WHERE 1=1 
AND (@OrderId IS NULL OR c.OrderId = @OrderId) 

。如果它不是NULL,那麼過濾器的後半部分將會觸發。

+0

1 = 1在這裏似乎沒有必要。使用這個 –

+0

的任何特殊原因我是出於習慣做到的,以便在設計我的查詢時更容易地更改過濾器的位置。這是完全可選的,並不影響任何東西來保持它的出入(除了我的理智)。 –