sql - 如何在 PostgreSQL 中获取聚合的定义/源代码?

标签 sql postgresql aggregate-functions psql ddl

我发现这个相关答案很有用:

但是如何在没有 GUI 客户端(例如使用 psql 命令行)的情况下获得 CREATE AGGREGATE 语句?

最佳答案

生成 CREATE AGGREGATE 语句的现代版本 - 使用 format() 并转换为对象标识符类型以使其变得简单并添加双引号和模式限定在需要时自动添加标识符:

SELECT format('CREATE AGGREGATE %s (SFUNC = %s, STYPE = %s%s%s%s%s)'
            , aggfnoid::regprocedure
            , aggtransfn
            , aggtranstype::regtype
            , ', SORTOP = '    || NULLIF(aggsortop, 0)::regoper
            , ', INITCOND = '  || agginitval
            , ', FINALFUNC = ' || NULLIF(aggfinalfn, 0)
            , CASE WHEN aggfinalextra THEN ', FINALFUNC_EXTRA' END
            --  add more to cover special cases like moving-aggregate etc.
              ) AS ddl_agg
FROM   pg_aggregate
WHERE  aggfnoid = 'my_agg_func'::regproc;  -- name of agg func here

您可以在必要时对聚合函数的名称进行模式限定:

'public.my_agg_func'::regproc

和/或添加函数参数以在重载聚合函数的情况下消除歧义:

'array_agg(anyarray)'::regprocedure

这不包括移动聚合函数等特殊情况。可以轻松扩展以涵盖当前 Postgres 版本的所有选项。但下一个主要版本可能会带来新的选择。

函数 pg_get_aggregatedef() 类似于现有的 pg_get_functiondef()消除对这个自定义查询的需求会很好——它可能必须适应每个新的主要 Postgres 版本......

关于sql - 如何在 PostgreSQL 中获取聚合的定义/源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27899642/

相关文章:

mysql - 使用 JOINS、ORDER BY 和数据透视表

vb.net - 恢复 PostgreSQL 数据库需要很长时间

c# - 使用 LINQ to SQL 对所有内容进行分组、求和和聚合

sql - MySQL 加入 WHERE 子句

sql - 将相似的多行合并为一行

java - JDBC插入查询不更新mysql数据库

php - 插入无值

ruby-on-rails - 是否可以在关联(belongs_to)中使用 postgresql 9.3 json 类型作为 foreign_key

python - SQLAlchemy 比 Psycopg2 更快。我的基准有什么问题?

SQL 管理工作室/SQL : Seeing the GroupBy/Sum aggregate functions