没有我知道的神奇功能,这意味着标准 Postgres 中可能没有这样的东西。
在您的示例中,信息模式或目录表对临时行类型没有帮助。但是您可能希望使用table来执行此操作,该 table将使用已注册的行类型并提供此路由:
WITH x AS (SELECT 'mytable'::regclass AS tbl)
SELECT 'SELECT '
|| string_agg(format('array_agg(%I) AS %1$I_arr', a.attname), E'\n ,')
|| E'\nFROM ' || tbl
FROM x
JOIN pg_attribute a ON a.attrelid = x.tbl
WHERE NOT a.attisdropped -- no dropped (dead) columns
AND a.attnum > 0 -- no system columns (you may or may not want this)
GROUP BY x.tbl
这会动态生成适当的 SQL 语句。
表名的强制转换regclass
使其免受 SQL 注入的影响。此相关答案中的更多解释:
Table name as a PostgreSQL function parameter
结果:
SELECT array_agg(col1) AS col1_arr
,array_agg("illegal nAmE") AS "illegal nAmE_arr"
, ...
FROM mytable
在函数中使用动态 SQL 实现完全自动化并不容易,因为返回类型也是动态的。您可以创建一个游标并返回它,但这可能是矫枉过正。