比较空字符串和null值 - SQL Server

5

我需要比较两个列,但在将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

在这种情况下,因为我们都知道空字符串和 null 列值是不同的,我希望看到结果返回“Pass”,但实际上并没有。根据 Martin 在这里的回答,他解释说这样的比较结果会得到“UNKNOWN”,而不是“TRUE”或“FALSE”,这解释了我看到这些结果的原因,但我需要找到一个解决方法。我知道一定有一个简单的方法可以解决这个问题,但我可能错过了什么……
我知道有一些内置函数,如 ISNULL()NULLIF(),但我不知道它们是否适用于此情况…

ISNULL()

如果我们使用 ISNULL() 函数将 null 值设置为空字符串,那么比较将无法工作,因为空字符串等于空字符串,例如:
DECLARE @EmptyString VARCHAR(20) = '',
        @Null VARCHAR(20) = Null;

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

这也会返回“FAIL”,所以这是不可行的。我可以使用ISNULL将其转换为另一个字符串,但这仍然不合适,因为空字符串可能具有不同的值,而这些值恰好可以与我们决定将null值转换为的任何值匹配。

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内置函数的作用感到困惑。 - Zohar Peled
1
我认为你在这个问题上把自己和其他人都搞糊涂了。你能否创建一个包含所有组合(A面和B面)及其预期结果的逻辑表,并将其更新到你的问题中? - MJH
4个回答

8

你的第一个例子返回失败,因为你使用了错误的运算符。如果你想判断某个东西是否等于另一个东西,你应该使用=而不是!=

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

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

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

因为你使用的是=而不是!=,所以返回的结果是通过。

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

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


@Null是一个参数(我知道),你可以通过它前面的@符号来识别。 - MJH

0

在编程中,将等号两侧的表达式计算结果相同更快且更符合“Pythonic”(易于他人阅读您的代码)的风格:

DECLARE @EmptyString VARCHAR(20) = ''

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

一个空字符串和一个真正的NULL值都将为搜索条件返回TRUE。

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

  • spouse_field = NULL(我仍然没有关于实体X婚姻状况的信息)
  • spouse_field = '' (空):该特定实体已确认为单身。否则,姓名会显示出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接