2015-01-07 48 views
1

为什么下面的简单查询在没有匹配的行时返回null(<Condition>没有被任何行满足)?ISNULL()返回NULL

SELECT ISNULL(MyField, 0) FROM [MyTable] WHERE <Condition> 

我试过COALESCE()以及类似的结果。如果没有匹配的行,我怎样才能返回零?

+2

如果''没有被满足,那么将不会有行。使用'count(*)'将返回匹配行的数量,如果没有行则显示'0'。 – Bharadwaj

+0

@Bharadwaj:我知道这就是为什么我发布这个问题。在这种情况下我怎样才能返回零呢? – dotNET

+1

使用'IF @@ ROWCOUNT> 0 ...'请参阅http://msdn.microsoft.com/en-us/library/ms187316.aspx –

回答

1

这将工作,只要你想到condition减少的结果设置为0或1行:

SELECT ISNULL((SELECT MyField FROM [MyTable] WHERE <Condition>),0) 

也就是说,创建一个没有FROM子句的外部查询(因此它总是会产生只有一个行),然后使用子查询来获取0或1行的实际数据。

+0

辉煌。这是一个简单的问题的简单解决方案。然而,我不明白为什么'ISNULL'在子查询上应用时与在字段上应用时行为不同,即使两种情况下返回的行数都为零。 – dotNET

+0

@dotNET - 正如我所说,我*外*查询有一行,而不是零。 'SELECT'子句是对结果集中每个*行做些什么的描述。如果它有零行来处理,它将工作零次。 –

+0

糟糕。我现在看到了。谢谢一堆。 – dotNET

0

使用此:

SELECT ISNULL(COUNT(MyField), 0) FROM [MyTable] WHERE <Condition> 

它会返回0如果行缺少。

+0

但是,如果条件得到满足,它将返回计数。 :) – dotNET

+0

'COUNT'总是给出一个数字,永远不会是'null',afaik – Bharadwaj

+0

@Bharadwaj:你没有明白。我是说当条件满足时它不会返回MyField。所以这个解决方案并没有完成所讨论的查询所要做的事情。 – dotNET

0

您不能转换0 rows1 row with a null value与任何SQL内置机能的研究,因为这可能会导致数据

的错误解释,但你可以使用下面的逻辑定制你的结果(与您在.NET做)。

If (select COUNT(MyField) FROM [MyTable] WHERE <Condition>)=0 
select 0 as [MyField] 
else 
SELECT ISNULL(MyField, 0) as [MyField] FROM [MyTable] WHERE <Condition>