所以今天早上我遇到了一个奇怪的错误,当时我不小心提到了 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 语法规则是什么,我尝试在文档中搜索对此语法的引用,但找不到任何内容;只是有很多关于 count(*) 的文档。谁能解释这是否是有效的 SQL 以及是否还有其他聚合函数也可以类似地调用?如果存在 Postgres 文档的链接,那就太棒了。
笔记。这是在 Postgres 9.5.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;
这在有关章节中有记录函数调用 https://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-EXPRESSIONS-OPERATOR-CALLS在手册中:
采用复合类型的单个参数的函数可以选择使用字段选择语法来调用,相反,字段选择可以用函数风格编写。也就是说,符号 col(table) 和 table.col 是可以互换的。此行为不是 SQL 标准,但在 PostgreSQL 中提供,因为它允许使用函数来模拟“计算字段”。欲了解更多信息,请参阅第 8.16.5 节。 https://www.postgresql.org/docs/current/static/rowtypes.html#ROWTYPES-USAGE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)