我可以使用下面的查询获取名称及其列的表:
SELECT t.table_name, array_agg(c.column_name::text) as columns
FROM information_schema.tables t inner
JOIN information_schema.columns c on t.table_name = c.table_name
WHERE t.table_schema = 'public'
AND t.table_type= 'BASE TABLE'
AND c.table_schema = 'public' group by t.table_name;
但是,我希望它按序数位置的顺序返回列。我如何编辑此查询才能执行此操作?
我尝试添加
ORDER BY ordinal_position
但不确定将其放置在哪里。
一种方法:添加每个聚合
ORDER BY
:
SELECT t.table_name
, array_agg(c.column_name::text ORDER BY c.ordinal_position) AS columns
FROM information_schema.tables t
JOIN information_schema.columns c USING (table_name, table_schema)
WHERE t.table_schema = 'public'
AND t.table_type = 'BASE TABLE'
GROUP BY t.table_name;
或者,对子查询中的行进行排序。参见:
在此过程中,这里有一个基于 Postgres 目录表的替代方案,基本上等效的查询:
SELECT relname AS table_name, array_agg (attname) AS columns
FROM (
SELECT c.relname, a.attname
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
WHERE c.relkind = 'r'
AND c.relnamespace = 'public'::regnamespace
AND a.attnum > 0
AND NOT a.attisdropped
ORDER BY 1, 2
limit 10
) sub
GROUP BY 1;
有利有弊。详情请参阅: