假设我具有以下聚合函数:
是否可以这样编写有效的SQL(以与数据库无关的方式):
SELECT [COL1, COL2 ....], AGG1(param1), AGG2(param2) FROM [SOME TABLES] WHERE [SOME CRITERIA] HAVING AGG3(param2) >-1 and AGG4(param4) < 123 GROUP BY COL1, COL2, ... COLN ORDER BY COL1, COLN ASC LIMIT 10
其中COL1 … COLN是要查询的表中的列,而param1 … paramX是传递给AGG函数的参数。
注意:AGG1和AGG2在结果中以列的形式返回(但不出现在HAVING CLAUSE中,而AGG3和AGG4出现在HAVING CLAUSE中,但不在结果集中返回。
理想情况下,我希望该解决方案具有数据库不可知的答案,但是如果我必须绑定到数据库,则我使用的是PostgreSQL(v9.x)。
只需澄清一下:我不反对在查询中使用GROUP BY。我的SQL不太好,因此上面的示例SQL可能会引起误导。我已经编辑了上面的伪sql语句,希望可以使我的意图更加清楚。
我要查找的主要内容是使用AGG函数的选择查询是否可以:
从到目前为止我收到的答案来看,似乎两个问题的答案都是“是”。我必须做的更正我的SQL的唯一想法是添加GROUP BY子句以确保返回的行是唯一的。
PostgreSQL的主要版本包含点号后的第一个数字,因此“ PostgreSQL(v9.x)”不够具体。正如@kekekela所说,没有(便宜的)完全db不可知论的方式。即使在PostgreSQL 9.0和9.1之间,在语法上也存在重要差异。
如果只有分组值AGG1(param1), AGG2(param2),则无需提供显式GROUP BY子句就可以摆脱。由于您混合了分组列和非分组列, 因此必须 提供一个GROUP BY子句,其中包含出现在中的所有非分组列SELECT。对于任何版本的PostgreSQL都是如此。阅读GROUP BY并在手册中找到它。
AGG1(param1), AGG2(param2)
GROUP BY
SELECT
但是,从 9.1 版开始,一旦您在中列出了主键,就GROUP BY可以跳过此表的其他列,并仍在SELECT列表中使用它们。9.1版的发行说明 告诉我们:
当在GROUP BY子句中指定了主键时,允许在查询目标列表中使用非GROUP BY列(Peter Eisentraut)
您是否打算将常量值提供给聚合函数?重点是什么?该文件告诉我们
聚合函数从多个输入行计算单个结果。
还是您希望这些参数成为列名?只要 在 提交数据库 之前 生成语句,就可以使用这种动态SQL 。准备语句或简单的不工作sql或plpgsql职能。为此,您必须在函数中使用EXECUTEplpgsql。
sql
plpgsql
作为对SQLI保障使用USING $1, $2的语法 值 和quote_ident()为您的列或表 名 。
USING $1, $2