我想你会发现在没有找到行的情况下,子选择实际上返回 NULL。
如果在子句触发的TagNames_CTE
地方找到一行并且为 NULL,它将被函数转换为。where
TagNames
''
但是在根本没有找到行的地方,函数不会被调用(因为没有行可以让它发挥它的魔力)并且整个子选择的结果是 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