2
WITH Dept(DName, HeadCount) AS (
   VALUES ('D1', 5), ('D2', 6), ('D3', 7)
) 

Select array_agg(DName), array_agg(HeadCount) from Dept

上面的查询将产生。

"{D1,D2,D3}";"{5,6,7}"

有没有办法在查询中生成相同的输出而不提及列名,即以通用方式。

是否有任何内置函数代替以下查询中的 magic_function?

 Select magic_function(*) from Dept

或者是否有任何方式,例如加入information_schema.columns,将动态提取字段名称。

4

1 回答 1

1

没有我知道的神奇功能,这意味着标准 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 实现完全自动化并不容易,因为返回类型也是动态的。您可以创建一个游标并返回它,但这可能是矫枉过正。

于 2013-06-13T13:57:35.523 回答