2

在 Oracle 9i 上,为什么以下会产生结果 'abc'

select 'abc ' || (select txt from 
     (select 'xyz' as txt from dual where 1=2)) 
from dual

虽然这会产生'abc xyz':

select 'abc ' || (select txt from 
     (select count(*), 'xyz' as txt from dual where 1=2)) 
from dual

为什么将 count(*) 添加到子查询会导致不同的行为?谓词是否应该where 1=2排除子查询中的任何结果?

4

5 回答 5

15
select count(*) from dual where 1=2

返回 0。即,值为零的行。

于 2009-06-10T18:55:18.237 回答
4

它返回子查询中所有内容的计数,正确为 0。使用聚合函数总是(并且正确)以这种方式运行,并且是 SQL 标准的一部分。

于 2009-06-10T18:55:37.377 回答
0

count将始终返回一个数值、0 或正整数,因此您的结果集中将始终有一行。

请注意,其他聚合函数可能会返回NULL

于 2009-06-10T19:06:13.597 回答
0

了解聚合函数如何在 SQL 中运行对于编写正确的查询至关重要。向查询添加聚合函数(如 sum、avg、min、max、count)时,您要求数据库对一组结果执行组操作。大多数聚合(如 min 和 max)在出现要操作的空行集时将返回 null。例外情况是 count() -当出现空集或行时,它(正确地)返回 0。

这个问题源于对一个更复杂的查询的分析——一个在 select 子句中有多个子查询表达式的查询。事实证明,在 select 表达式中添加 count(*) 对结果造成了一些破坏——因为它开始返回一个预期没有的值。

开发人员真正想要的是count(*)会产生 null 的情况。实现这一目标的最简单方法是使用 Oracle 中的分析。可以编写查询以使用等效的分析计数:count(*) over ()

select 'abc ' || (select txt from 
     (select count(*) over (), 'xyz' as txt from dual where 1=2)) 
from dual
于 2009-06-10T19:08:45.027 回答
0
 (select 'xyz' as txt from dual where 1=2)) 

此子查询不返回任何行。

 (select count(*), 'xyz' as txt from dual where 1=2)) 

此子查询始终返回 1 行。

这就是行为不同的原因。

于 2009-06-11T12:06:47.203 回答