我发现这个相关答案很有用:
但是如何在没有 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/