查询所有表及其序号位置的列名

问题描述 投票:0回答:1

我可以使用下面的查询获取名称及其列的表:

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
但不确定将其放置在哪里。

sql postgresql sql-order-by information-schema
1个回答
0
投票

一种方法:添加每个聚合

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;

有利有弊。详情请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.