由于变量为NULL,避免IF ELSE

时间:2013-10-30 13:00:49

标签: sql-server-2008 tsql

我有一些代码,其中WHERE子句中使用的变量可以为空。因此,我必须使用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

3 个答案:

答案 0 :(得分:5)

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

将有效地做到这一点。

有关详情,请参阅Undocumented Query Plans: Equality Comparisons

答案 1 :(得分:1)

假设您想要所有记录,其中order_id为null或等于提供的订单ID,则使用COALESCE将保留原始订单ID(如果不为null),但如果 为null,则会生成提供的订单ID。然后将其与提供的订单ID进行比较。

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

根据查询的正确版本,我要么在WHERE子句中全部写出来,要么将COALESCE双方写入一个已知不会出现在该列中的值 ever

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, '@@@')

答案 2 :(得分:0)

试试这个

DECLARE @OrderID UNIQUEIDENTIFIER

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