【问题标题】:Comparing empty string with null value - SQL Server将空字符串与空值进行比较 - SQL Server
【发布时间】:2018-10-02 14:51:51
【问题描述】:

我需要比较两列,并且在将 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 值是否不等于空字符串?

【问题讨论】:

  • 我已经阅读了您的问题两次,但仍然不明白您在问什么。似乎您对 ISNULLNULLIF 内置函数的作用感到困惑。
  • 我想你已经把这个问题弄糊涂了。您能否创建一个包含预期结果的所有组合(A 侧和 B 侧)的逻辑表并更新您的问题?

标签: sql sql-server


【解决方案1】:

您的第一个示例返回失败,因为您使用了错误的运算符。如果您想查看某事物是否等于其他事物,请使用 =,而不是 !=

这是证明NULL可以与''比较的代码:

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

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

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

【讨论】:

    【解决方案2】:

    只是颠倒比较:

    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
    

    【讨论】:

      【解决方案3】:
      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 值。

      【讨论】:

      • @Null 是一个参数(我知道),你可以通过它前面的 @ 符号来判断。
      【解决方案4】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        相关资源
        最近更新 更多