比较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