繁体   English   中英

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

[英]Comparing empty string with null value - 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's asnwer here ,他解释说,像这样的比较结果是UNKNOWN ,而不是TRUEFALSE ,这阐明了我看到这些结果的原因,但我需要找到解决方案。 我知道必须有一个简单的方法来解决这个问题,我错过了......

我知道有一些内置函数,例如ISNULL()NULLIF() ,但是我不知道这些在这种情况下是否有帮助......

一片空白()

例如,如果我们使用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值是否不等于空字符串?

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

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

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

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

它返回pass,因为你使用= ,而不是!=

只需反转比较:

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
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值。

在等号两侧评估相同的结果会更快、更“Pythonic”(更容易被阅读您代码的其他人理解):

DECLARE @EmptyString VARCHAR(20) = ''

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

EMPTY 字符串和真正的 NULL 值都将为搜索条件产生 TRUE。

注意:这不是最优的,因为良好的业务规则实践应该清楚地区分 NULL 属性和 EMPTY 属性。 IE

  • 配偶字段 = NULL(我还没有关于实体 X 的婚姻状况的信息)
  • 配偶字段 = '' (空) :该特定实体被确认为单身。 否则,一个名字就会出现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM