gpt4 book ai didi

sql - 是否可以以这种方式使用 AGG 函数的 SQL 查询?

转载 作者:行者123 更新时间:2023-11-29 11:48:44 27 4
gpt4 key购买 nike

假设我有以下聚合函数:

  • AGG1
  • AGG2
  • AGG3
  • AGG4

是否可以像这样编写有效的 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中但不在结果集中返回。

理想情况下,我想要一个与数据库无关的解决方案答案,但如果我必须绑定(bind)到数据库,我使用的是 PostgreSQL (v9.x)。

编辑

只是澄清一下:我不反对在查询中使用 GROUP BY。我的 SQL 不是很好,所以上面的示例 SQL 可能有点误导。我已经编辑了上面的伪 sql 语句,希望能使我的意图更加清楚。

我想知道的主要是使用 AGG 函数的选择查询是否可以:

  • 在没有在 HAVING 子句中指定的情况下,在返回列中包含聚合函数值。
  • 在 HAVING 子句中指定聚合函数,但不在结果集中返回。

从我目前收到的答案来看,这两个问题的答案似乎都是肯定的。我唯一想纠正我的 SQL 的方法是添加一个 GROUP BY 子句以确保返回的行是唯一的。

最佳答案

PostgreSQL 主要版本包括点后的第一个数字,因此“PostgreSQL (v9.x)”不够具体。正如@kekekela 所说,没有(便宜的)完全与数据库无关的方式。即使在 PostgreSQL 9.0 和 9.1 之间也存在重要的语法差异。

如果您只有分组值 AGG1(param1), AGG2(param2),则无需提供明确的 GROUP BY 子句即可。由于您混合了分组列和非分组列,因此您必须为出现在 SELECT 中的所有非分组列提供一个 GROUP BY 子句。对于任何版本的 PostgreSQL 都是如此。了解 GROUP BY and HAVING it in the manual .

但是,从版本 9.1 开始,一旦您在 GROUP BY 中列出了一个主键,您就可以跳过该表的其他列并仍然在 >SELECT 列表。 release notes for version 9.1告诉我们:

Allow non-GROUP BY columns in the query target list when the primary key is specified in the GROUP BY clause (Peter Eisentraut)

关于参数

您是否打算将常量值提供给聚合函数?重点是什么? docs tell us

An aggregate function computes a single result from multiple input rows.

或者您希望这些参数是列名吗?只要语句是在 提交到数据库之前生成的,这种动态 SQL 就可以工作。不适用于准备好的语句或简单的 sqlplpgsql 函数。你必须使用 EXECUTEplpgsql 函数中用于该目的。

作为针对 SQLi 的保护措施,对 quote_ident() 使用 USING $1, $2 语法为您的列或表名称

关于sql - 是否可以以这种方式使用 AGG 函数的 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870148/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com