所以当我意外地提到一个不存在的"计数时,我遇到了我认为是一个奇怪的错误。我的CTE专栏。 Postgres正在寻找GROUP BY条款,尽管我并不认为我在做聚合。多一点玩,看起来table.count相当于一个计数星函数。请考虑以下事项:
SELECT
c.clinic_id,
c.count,
count(*) as count_star
FROM clinic_member c
GROUP BY
c.clinic_id
ORDER BY clinic_id;
这将在我的数据集中生成如下所示的结果:
很明白了解Postgres的实际语法规则是什么,我尝试在文档中搜索这种语法的引用,但却无法找到任何内容;只有很多计数(*)的文档。任何人都可以解释这是否是有效的SQL以及是否还有其他聚合函数也可以类似地调用?如果存在,Postgres文档的链接将非常棒。
请注意。这是Postgres 9.5.9
答案 0 :(得分:9)
它是有效的Postgres语法,因为在Postgres中,可以用两种不同的方式调用具有与表类型匹配的单个参数的函数:
假设一个表名foo
和一个名为some_function
的函数,其中一个参数类型为foo
,则表示以下内容:
select some_function(f)
from foo f;
相当于
select f.some_function
from foo f;
实际上没有必要使用别名:
select foo.some_function
from foo;
这是"面向对象的结果" Postgres的结构。
count()
可以接受任何参数 - 包括行引用(=记录)因此
select count(f)
from foo f;
相当于
select f.count
from foo f;
这在手册中有关Function Calls的章节中有记录:
可以选择使用字段选择语法调用采用复合类型的单个参数的函数,相反,可以使用函数样式编写字段选择。也就是说,符号col(table)和table.col是可以互换的。此行为不是SQL标准,但在PostgreSQL中提供,因为它允许使用函数来模拟“计算字段”。有关详细信息,请参阅Section 8.16.5.