我将此作为select语句中的一个字段:
select
...some fields
(select ISNULL( TagNames, '') from TagNames_CTE as tagNames
where Content.ID = tagNames.EntryID) as tags
from SomeTable
我注意到即使我正在使用ISNULL并告诉它用空字符串替换它们,我仍然会为某些记录返回NULL。它不是用空字符串替换它们,我不明白为什么。
答案 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,它支持多个参数,类型强制是有道理的)