假设你有下一个代码:
DECLARE @A INT = 1,
@B INT = NULL;
IF (@B != @A)
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
正如您所见,变量@A
等于' 1' 肯定而变量@B
肯定不会。我正在 Microsoft SQL Server Management Studio 2014 中执行该部分代码,并且我得到&#39; <&#39; 作为结果。这意味着@A
与@B
不同,但它与@B
也没有区别。这怎么可能呢?我在这里缺少什么?
答案 0 :(得分:7)
您无法将null与其他值进行比较。您需要单独处理空值。 所以,这将起作用
DECLARE @A INT = 1,
@B INT = NULL;
IF (@B != @A or @B is null )
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
答案 1 :(得分:2)
正确的版本应为:
IF (@B = @A OR (@B IS NULL AND @A IS NULL))
SELECT 2;
ELSE IF (@B != @A OR @B IS NULL OR @A IS NULL)
SELECT 1;
ELSE
SELECT 3;
因为必须始终在SQL中单独处理NULL比较。
我颠倒了!=
和=
个案,因为tsql没有逻辑XOR运算符,因为我想将NULL视为NULL。
请注意,SELECT 3
现在不会发生。
答案 2 :(得分:1)
我总是使用ISNULL功能。我认为ISNULL函数可以帮助您避免编写更长的脚本。
DECLARE @A INT = 1,
@B INT = NULL;
IF (ISNULL(@B,0) != ISNULL(@A,0))
SELECT 1;
ELSE IF (@B = @A)
SELECT 2;
ELSE
SELECT 3;
答案 3 :(得分:0)
您可以使用INTERSECT
轻松比较变量,因为它是NULL
- 敏感:
DECLARE @A BIT = NULL
,@B BIT = 1;
IF EXISTS
(
SELECT @A
INTERSECT
SELECT @B
)
SELECT 'equal';
ELSE
SELECT 'not equal';
此外,当您需要在复杂查询中进行此类比较时,这可以提高性能,因为它允许使用索引。