比较SQL中的两个变量
假设您有下一个代码:比较SQL中的两个变量,sql,tsql,sql-server-2014,Sql,Tsql,Sql Server 2014,假设您有下一个代码: 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中执行这部分代码,结果得到“3”。这意味着@A与@B不同,但也与@B相同。这怎
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中执行这部分代码,结果得到“3”。这意味着@A
与@B
不同,但也与@B
相同。这怎么可能呢?这里缺少什么?不能将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;
正确的版本应为:
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中必须始终单独处理空比较
我把倒过来了=代码>和<代码>=/COD>案例,因为TSQL没有逻辑XOR运算符,因为我想NULL等于NULL。< /P>
请注意,SELECT 3
现在永远不会出现。我总是使用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;
您可以使用INTERSECT
轻松比较变量,因为它是NULL
敏感的:
DECLARE @A BIT = NULL
,@B BIT = 1;
IF EXISTS
(
SELECT @A
INTERSECT
SELECT @B
)
SELECT 'equal';
ELSE
SELECT 'not equal';
此外,当您需要在复杂查询中进行此类比较时,这可以提高性能,因为它允许使用索引。您对NULL
值缺乏了解。几乎任何与NULL
的比较都会返回NULL
,这被视为false。SQL学习材料、文档和其他堆栈溢出问题中都涉及到了这一点。关于与NULL
值进行比较的另一个好/酷的方面可以在这里找到。比较NULL的唯一方法是与is NULL
/is NOT NULL
operators@GordonLinoff谢谢我想我错过了一些基本的东西=/为什么不检查@A是否为空?我解释了为什么他的代码不起作用。我的答案更具体地针对他的输入数据。您使用的是ISNULL()
中可能值域内的值@A=1,@B=NULL返回SELECT 1
,而@A=0,@B=NULL返回SELECT 3
。