0

我将此作为我的选择语句中的字段之一:

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

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

4

2 回答 2

1

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

如果在子句触发的TagNames_CTE地方找到一行并且为 NULL,它将函数转换为。whereTagNames''

但是在根本没有找到行的地方,函数不会被调用(因为没有行可以让它发挥它的魔力)并且整个子选择的结果是 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,而后者给了你1,2。在 MySQL 中使用以下语句进行测试后,您可以看到这很可能是正确的。

> create table xyzzy (plugh integer);

> insert into xyzzy values (42):

> select 1,(select ifnull (null, 2) from xyzzy where 1 = 0) from xyzzy;
1 NULL

> select 1,(select ifnull (null, 2) from xyzzy where 1 = 1) from xyzzy;
1 2
于 2013-01-18T06:58:57.887 回答
1

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

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

所以把它移到子查询的外面。(我通常也会推荐COALESCEover ISNULL。它是标准 SQL,它支持多个参数,并且类型强制很有意义)

于 2013-01-18T07:18:26.547 回答