如何在 PostgreSQL 中获取聚合的定义/源代码?[英] How to get definition/source code of an aggregate in PostgreSQL?

本文是小编为大家收集整理的关于如何在 PostgreSQL 中获取聚合的定义/源代码?的处理方法,想解了如何在 PostgreSQL 中获取聚合的定义/源代码?的问题怎么解决?如何在 PostgreSQL 中获取聚合的定义/源代码?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我发现此相关答案很有用:

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

推荐答案

类似的东西,但我不确定这是否涵盖了创建聚合的所有可能方法(绝对不需要引用标识符)

SELECT 'create aggregate '||n.nspname||'.'||p.proname||'('||format_type(a.aggtranstype, null)||') (sfunc = '||a.aggtransfn
       ||', stype = '||format_type(a.aggtranstype, null)
       ||case when op.oprname is null then '' else ', sortop = '||op.oprname end 
       ||case when a.agginitval is null then '' else ', initcond = '||a.agginitval end
       ||')' as source
FROM pg_proc p 
  JOIN pg_namespace n ON p.pronamespace = n.oid 
  JOIN pg_aggregate a ON a.aggfnoid = p.oid 
  LEFT JOIN pg_operator op ON op.oid = a.aggsortop 
where p.proname = 'your_aggregate'
  and n.nspname = 'public' --- replace with your schema name  

其他推荐答案

现代版本可以生成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版本...

其他推荐答案

我使用某些系统功能的我的版本

SELECT 
format(
   E'CREATE AGGREGATE %s (\n%s\n);'
   , (pg_identify_object('pg_proc'::regclass, aggfnoid, 0)).identity
   , array_to_string(
      ARRAY[
     format(E'\tSFUNC = %s', aggtransfn::regproc)
     , format(E'\tSTYPE = %s', format_type(aggtranstype, NULL))
     , CASE aggfinalfn WHEN '-'::regproc THEN NULL ELSE format(E'\tFINALFUNC = %s',aggfinalfn::text) END
     , CASE aggsortop WHEN 0 THEN NULL ELSE format(E'\tSORTOP = %s', oprname) END
     , CASE WHEN agginitval IS NULL THEN NULL ELSE format(E'\tINITCOND = %s', agginitval) END
      ]
      , E',\n'
   )
)

FROM pg_aggregate
LEFT JOIN pg_operator ON pg_operator.oid = aggsortop
WHERE aggfnoid = 'regr_r2'::regproc;

本文地址:https://www.itbaoku.cn/post/1763961.html