比较SQL

时间:2015-08-12 11:09:44

标签: 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等于&#39; 1&#39; 肯定而变量@B肯定不会。我正在 Microsoft SQL Server Management Studio 2014 中执行该部分代码,并且我得到&#39; <&#39; 作为结果。这意味着@A@B不同,但它与@B也没有区别。这怎么可能呢?我在这里缺少什么?

4 个答案:

答案 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';

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