【问题标题】:Comparing two variables in SQL比较 SQL 中的两个变量
【发布时间】:2015-11-04 23:03:17
【问题描述】:

假设你有下一个代码:

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 值的理解。几乎所有与NULL 的比较都会返回NULL,它被视为假。这在 SQL、文档和其他 Stack Overflow 问题的学习材料中都有介绍。
  • 另一个关于与NULL 值比较的好/酷的事情可以在awesome answer here 中找到。
  • 比较 NULL 的唯一方法是使用 IS NULL/IS NOT NULL 运算符
  • @GordonLinoff 谢谢,我想我错过了一些基本的东西。 =/

标签: sql tsql sql-server-2014


【解决方案1】:

您不能将 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;

【讨论】:

  • 为什么不检查@A 是否为空?
  • 我解释了为什么他的代码不起作用。我的回答更具体到他的输入数据。
【解决方案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;

因为 NULL 比较必须始终在 SQL 中单独处理。

我颠倒了!== 的情况,因为 tsql 没有逻辑异或运算符,因为我想认为 NULL 等于 NULL。

请注意,SELECT 3 现在不会发生。

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 您正在使用ISNULL() 中可能值域内的值。 @A = 1,@B = NULL 返回SELECT 1,而@A = 0,@B = NULL 返回SELECT 3
    【解决方案4】:

    您可以使用INTERSECT 轻松比较变量,因为它是NULL-sensitive:

    DECLARE @A BIT = NULL
           ,@B BIT = 1;
    
    IF EXISTS
    (
        SELECT @A
        INTERSECT 
        SELECT @B
    )
        SELECT 'equal';
    ELSE
        SELECT 'not equal';
    

    此外,当您需要在复杂查询中进行此类比较时,这可以提高性能,因为它允许使用索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多