2013-10-30 40 views
3

我有一些代碼在WHERE子句中使用的變量可以爲空。因此我必須使用IF ELSE來查詢數據來檢查NULL。無論如何在一個查詢中寫入?避免IF ELSE由於變量爲NULL

DECLARE @OrderID UNIQUEIDENTIFIER 

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

固定複製粘貼錯誤 –

回答

5
SELECT * 
    FROM Customers 
    WHERE EXISTS (SELECT OrderID INTERSECT SELECT @OrderID) 

將有效地做到這一點。

有關更多信息,請參閱Undocumented Query Plans: Equality Comparisons

+0

這是要與連接一起使用嗎? –

+0

@PaulSnow我不知道你是什麼意思。但是,是的,如果這就是你所要求的,你可以在連接條件中使用它。 CREATE TABLE#T1(X INT NULL UNIQUE); CREATE TABLE#T2(X INT NULL UNIQUE); SELECT * FROM#T1 JOIN#T2 ON EXISTS(SELECT#T1.X INTERSECT SELECT#T2.X); DROP TABLE# T1,#T2' –

+0

@MartinSmith,與WHERE OrderID爲NULL和@OrderID爲NULL或OrderID = @ OrderID有什麼區別? –

0

試試這個

DECLARE @OrderID UNIQUEIDENTIFIER 

SELECT * FROM Customers 
WHERE ISNULL(@OrderID, 0) = 0 or @OrderID = @OrderID 
1

假設您想要order_id爲null或等於提供的訂單ID的所有記錄,則使用COALESCE將保留原始訂單ID(如果不是null),但會生成提供的訂單ID(如果它的爲null)。然後將它與提供的訂單ID進行比較。

SELECT * 
FROM customers c 
WHERE COALESCE(c.order_id, @OrderID) = @OrderID; 

基於查詢的正確版本,我想無論是這一切寫出來的WHERE子句中,或可能COALESCE雙方已知不出現在該列值有史以來

SELECT c.* 
FROM customers c 
WHERE (@OrderID IS NULL AND c.OrderId IS NULL) OR c.OrderId = @OrderId 

-- OR 

SELECT c.* 
FROM customers c 
WHERE COALESCE(@OrderId, '@@@') = COALESCE(c.OrderId, '@@@') 
+0

都不能給出預期結果 –

+0

根據仍有複製+粘貼錯誤的版本解釋了您的問題。 – SQB

+0

@OrderID的值爲空時,這些解決方案都不適用於我的情況 –