将空字符串与空值进行比较 - SQL Server

时间:2018-04-22 13:02:07

标签: sql sql-server

我需要比较两列,并在将NULL与空字符串进行比较时遇到问题。简而言之,这就是我所看到的。

DECLARE @EmptyString VARCHAR(20) = '', -- Could have valid VARCHAR data, empty string, or NULL
        @Null VARCHAR(20) = Null; -- Could have valid VARCHAR data, empty string, or NULL

SELECT 
    CASE WHEN @EmptyString != @Null THEN 'Pass' ELSE 'Fail' END AS EmptyStringVsNull

在这种情况下,因为我们都知道空字符串和空列值不同,我希望看到结果返回“通过”,但它不会。

来自Martin的asnwer here,他解释说,这样的比较结果是UNKNOWN,而不是TRUEFALSE,这澄清了我看到这些的原因结果,但我需要找到一个解决方案。我知道必须是一个简单的解决方法,我错过了......

我知道有一些内置功能,例如ISNULL()NULLIF(),但我不知道这些是否可以帮助解决这种情况......

ISNULL()

如果我们使用ISNULL()函数将空值设置为空字符串,那么比较将不会起作用,因为空字符串等于空字符串,例如

DECLARE @EmptyString VARCHAR(20) = '',
        @Null VARCHAR(20) = Null;

SELECT 
    CASE WHEN ISNULL(@EmptyString, '') != ISNULL(@Null, '') THEN 'Pass' ELSE 'Fail' END AS EmptyStringVsNull

这也会返回'FAIL',所以这是不行的。我总是可以使用ISNULL将其转换为不同的字符串,但这仍然不合适,因为空字符串可能具有不同的值,偶然可以匹配我们决定将空值转换为的值。

NULLIF()

DECLARE @EmptyString VARCHAR(20) = '',
        @Null VARCHAR(20) = Null;

SELECT 
    CASE WHEN NULLIF(@EmptyString, '') != NULLIF(@Null, '') THEN 'Pass' ELSE 'Fail' END AS EmptyStringVsNull

如果我们使用NULLIF()函数将空字符串转换为null,则我们的比较仍然不会返回true。这是因为,如链接帖子中所述,比较空值会产生UNKNOWN

使用上面的简单SQL示例,如何检查NULL值是否等于空字符串?

3 个答案:

答案 0 :(得分:5)

您的第一个示例返回失败,因为您的操作符错误。如果您想查看某些内容是否等于其他内容,请使用=,而不是!=

以下代码证明NULL可以与''进行比较:

DECLARE @EmptyString VARCHAR(20) = '',
        @Null VARCHAR(20) = Null;

SELECT 
    CASE WHEN ISNULL(@EmptyString, '') = ISNULL(@Null, '') 
    THEN 'Pass' ELSE 'Fail' 
    END AS EmptyStringVsNull

它会返回通行证,因为您使用的是=,而不是!=

答案 1 :(得分:3)

只需反转比较:

SELECT (CASE WHEN @EmptyString = @Null THEN 'Fail' ELSE 'Pass' END) as EmptyStringVsNull

唯一的复杂因素是您希望两个NULL值相同。如果是这样的话:

SELECT (CASE WHEN @EmptyString = @Null OR (@EmptyString IS NULL AND @Null IS NULL)
             THEN 'Fail' ELSE 'Pass'
        END) as EmptyStringVsNull

答案 2 :(得分:0)

DECLARE @EmptyString VARCHAR(20) = '', -- Could have VARCHAR data, empty string, or NULL
        @Null VARCHAR(20) = Null; -- Could have VARCHAR data, empty string, or NULL

SELECT 
    CASE WHEN @EmptyString IS NOT  @Null THEN 'Pass' ELSE 'Fail' END AS EmptyStringVsNull.

由于ansi sql标准,您可以使用IS NULL或IS NOT NULL运算符检查NUll值。