首页 > 解决方案 > 如何检索postgres功能索引列名

问题描述

我想检索 postgres 数据库中的所有功能索引及其列名。但是在捆绑了很多之后,我无法获得功能索引列名。

从下面的查询中,我可以获得单一的普通索引类型。

select  t.relname as tableName, 
        i.relname as indexName, 
        STRING_AGG(pga.attname||'', ','order by i.relname,pga.attnum)   as columnName             
from pg_class t 
  inner join pg_index ix on t.oid = ix.indrelid 
  inner join pg_class i on i.oid = ix.indexrelid 
  inner join pg_attribute pga on pga.attrelid = i.oid 
  inner join pg_indexes pgidx on pgidx.indexname=i.relname 
where t.relkind = 'r' 
  and pgidx.schemaname = ?
group by t.relname, i.relname 
having count(*) = 1 
order by i.relname

标签: sqlpostgresql

解决方案


在这里阅读文档时,我创建了一个(小)测试:

luuk=# create table test1 (col1 varchar(20));
luuk=# insert into test1 values('test'),('Test'),('TEST');
luuk=# select * from test1 where lower(col1)='test';
 col1
------
 test
 Test
 TEST
(3 rows)

luuk=# CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
    
luuk=# select indexdef from pg_indexes where indexname='test1_lower_col1_idx';
                                      indexdef
-------------------------------------------------------------------------------------
 CREATE INDEX test1_lower_col1_idx ON public.test1 USING btree (lower((col1)::text))
(1 row)

luuk=#

我确实看到了创建的功能索引的完整定义。现在只需解析此字符串即可找到所有列名。


推荐阅读