【发布时间】: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,而不是 TRUE 或 FALSE,这说明了我看到这些结果的原因,但我需要找到解决方案对此。我知道必须有一个我想念的简单方法......
我知道有一些内置函数,例如 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 值是否不等于空字符串?
【问题讨论】:
-
我已经阅读了您的问题两次,但仍然不明白您在问什么。似乎您对
ISNULL和NULLIF内置函数的作用感到困惑。 -
我想你已经把这个问题弄糊涂了。您能否创建一个包含预期结果的所有组合(A 侧和 B 侧)的逻辑表并更新您的问题?
标签: sql sql-server