比较 SQL 中的两个变量

Comparing two variables in SQL

假设您有下一个代码:

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;

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

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

请注意,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';

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