我需要比较两个列,但在将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
值不等于空字符串?
ISNULL
和NULLIF
内置函数的作用感到困惑。 - Zohar Peled