【发布时间】:2013-12-11 23:30:25
【问题描述】:
我列出了 PostgreSQL 模式的所有函数,并且函数的每个参数都需要人类可读的类型。在proallargtypes 中表示为数组的类型 a 的 OID。我可以取消嵌套数组并将format_type() 应用于它,这会导致查询拆分为单个函数的多行。为避免这种情况,我必须再次创建一个外部 SELECT 到 GROUP argtypes,因为显然不能对未嵌套的数组进行分组。所有列都依赖于 proname 但我必须在 GROUP BY 子句中列出所有列,这是不必要的,但 proname is not a primary key。
有没有更好的方法来实现我这样的输出目标:
proname | ... | protypes
-------------------------------------
test | ... | {integer,integer}
我目前正在使用这个查询:
SELECT
proname,
prosrc,
pronargs,
proargmodes,
array_agg(proargtypes), -- see here
proallargtypes,
proargnames,
prodefaults,
prorettype,
lanname
FROM (
SELECT
p.proname,
p.prosrc,
p.pronargs,
p.proargmodes,
format_type(unnest(p.proallargtypes), NULL) AS proargtypes, -- and here
p.proallargtypes,
p.proargnames,
pg_get_expr(p.proargdefaults, 0) AS prodefaults,
format_type(p.prorettype, NULL) AS prorettype,
l.lanname
FROM pg_catalog.pg_proc p
JOIN pg_catalog.pg_language l
ON l.oid = p.prolang
JOIN pg_catalog.pg_namespace n
ON n.oid = p.pronamespace
WHERE n.nspname = 'public'
) x
GROUP BY proname, prosrc, pronargs, proargmodes, proallargtypes, proargnames, prodefaults, prorettype, lanname
【问题讨论】:
标签: arrays postgresql select