在 SQL Server 中比较 NULL 与 NULL

问题描述 投票:0回答:4

我有一些代码,其中 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
sql sql-server t-sql null
4个回答
9
投票
  SELECT * 
  FROM Customers
  WHERE EXISTS (SELECT OrderID INTERSECT SELECT @OrderID)

将有效地做到这一点。

有关更多信息,请参阅未记录的查询计划:相等比较


1
投票

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


根据查询的正确版本,我要么将其全部写在 WHERE 子句中,要么可能将两侧合并为已知不会出现在该列中的值
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, '@@@')



0
投票
SQL Server 2022 和 Azure

现在支持 IS [NOT] DISTINCT FROM

 语法。这将进行正确的空比较。
SELECT * FROM Customers WHERE OrderID IS NOT DISTINCT FROM @OrderID;



-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.