T-SQL CASE子句:关于使用外部联接指定何时为NULL的问题

T-SQL CASE子句:关于使用外部联接指定何时为NULL的问题,sql,tsql,sql-server-2012,Sql,Tsql,Sql Server 2012,以下查询将正确显示所有当前/潜在客户的记录,无论其是否下订单。但是下面的SELECT语句的YesNO别名总是返回1,即使在某些情况下o.OrderID为空(即透视客户尚未下订单)。为什么?我认为下面的案例陈述是正确的(如回答中所示)。我使用的是SQLServer2012注意:请记住,尽管OrderID是PK,但如果不满足联接条件,则在外部联接中,它将始终与orders表的所有其他列一起为空 SELECT c.customerID, o.OrderID, CASE When o.OrderID i

以下查询将正确显示所有当前/潜在客户的记录,无论其是否下订单。但是下面的
SELECT
语句的
YesNO
别名总是返回1,即使在某些情况下
o.OrderID
为空(即透视客户尚未下订单)。为什么?我认为下面的案例陈述是正确的(如回答中所示)。我使用的是
SQLServer2012
注意:请记住,尽管OrderID是PK,但如果不满足联接条件,则在外部联接中,它将始终与orders表的所有其他列一起为空

SELECT c.customerID, o.OrderID, CASE When o.OrderID is NULL Then 0 Else 1 End as YesNO
FROM Customers c
LEFT JOIN Orders o
 ON c.customerID = o.customerID
尝试使用ISNULL

我很确定原因是因为当你将is NULL与NULL进行比较时,结果为NULL,因此为False,因此它的计算结果为ELSE 1

SELECT c.customerID, o.OrderID, CASE When ISNULL(o.OrderID, 0) = 0 Then 0 Else 
1 End as YesNO
FROM Customers c
LEFT JOIN Orders o
 ON c.customerID = o.customerID
尝试使用ISNULL

我很确定原因是因为当你将is NULL与NULL进行比较时,结果为NULL,因此为False,因此它的计算结果为ELSE 1

SELECT c.customerID, o.OrderID, CASE When ISNULL(o.OrderID, 0) = 0 Then 0 Else 
1 End as YesNO
FROM Customers c
LEFT JOIN Orders o
 ON c.customerID = o.customerID

是否确实存在
o.OrderId
为空的情况?或者应该是
c.OrderId
?@DigiFriend是的。这就是为什么我在
SELECT
中包含
o.OrderId
,以便我可以验证。你是在northwind数据库下执行的吗?你的问题是正确的。如果是,则“FISSA”customerid orderid为null的属性显示为0,如果您获得的是
1
,则
o.orderid
不是
null
。您是否认为其他值为
null
而不是实际的
null
值?是否确实存在
o.OrderId
为null的情况?或者应该是
c.OrderId
?@DigiFriend是的。这就是为什么我在
SELECT
中包含
o.OrderId
,以便我可以验证。你是在northwind数据库下执行的吗?你的问题是正确的。如果是,则“FISSA”customerid orderid为null的属性显示为0,如果您获得的是
1
,则
o.orderid
不是
null
。您是否认为其他值为
null
而不是实际的
null
值?也感谢您解释问题的可能原因。当您检查值
是否为null
时,它将返回true或false,而不是
null
。当您尝试使用
=null
检查值是否为null时,您将得到
null
。另外,
null
并不意味着false,但也不意味着true,因为它不是
true
,所以当…时,它不会按照
返回
0
。也感谢您解释问题的可能原因。当您检查值
是否为null
时,它会返回true或false,而不是
null
。当您尝试使用
=null
检查值是否为null时,您将得到
null
。另外,
null
并不意味着false,但也不意味着true,因为它不是
true
,所以当…
时,它不会按照
返回
0