带有空字符串的ISNULL for alternate仍会返回一些NULL

时间:2013-01-18 06:56:32

标签: tsql

我将此作为select语句中的一个字段:

select
      ...some fields
            (select ISNULL( TagNames, '') from  TagNames_CTE as tagNames 
         where  Content.ID = tagNames.EntryID) as tags 
from  SomeTable

我注意到即使我正在使用ISNULL并告诉它用空字符串替换它们,我仍然会为某些记录返回NULL。它不是用空字符串替换它们,我不明白为什么。

2 个答案:

答案 0 :(得分:1)

我想你会发现在没有找到行的情况下,subselect实际上会返回NULL。

如果在TagNames_CTE中发现where子句触发且TagNames为NULL的行,则 将转换为{{1}通过函数。

但是在没有行的情况下,该函数未被调用(因为没有行可以使其工作)并且整个子选择的结果为NULL,因为它必须在该列中为外部选择返回某些

一种简单的检查方法是单独运行子查询(不带'')并查看它是否返回包含ISNULL()的行或根本没有行 - 尝试一些简单的查询的:

NULL

select 1,
       (select isnull (null,2) from dummytable where 1 = 0)
from dummytable

您可能会发现前者为您提供select 1, (select isnull (null,2) from dummytable where 1 = 1) from dummytable 而后者为您提供1, null。使用以下语句在MySQL中测试过后,您可以看到这很可能是正确的。

1,2

答案 1 :(得分:1)

因为在子查询中,ISNULL只能影响实际存在于行中的NULL。我假设您实际需要处理的是子查询不返回任何行的情况:

select
      ...some fields
            ISNULL((select  TagNames from  TagNames_CTE as tagNames 
         where  Content.ID = tagNames.EntryID), '') as tags 
from  SomeTable

所以将它移到子查询的外部。 (我通常也建议COALESCE超过ISNULL。它是标准的SQL,它支持多个参数,类型强制是有道理的)