如何在PostgreSQL数据库的索引中获取列的位置? pg_index目录表中的indkey给出了该列表中该列的位置,但我希望列中的列的位置包含索引。
答案 0 :(得分:5)
这是一种方式。这可能不是最好的方式。
SELECT c.relname, a.attname, a.attnum
FROM pg_attribute a
INNER JOIN pg_class c on c.oid = a.attrelid
WHERE c.relkind = 'i'
AND c.relname = 'beds_pkey'
AND a.attnum > 0
其中beds_pkey
是索引的名称。
答案 1 :(得分:1)
indkey
是一个数组,该数组中条目的顺序决定了索引列的顺序。
因此,如果indkey
包含{2,4},那么表的第二列首先出现在索引中,而表的第四列是索引中的第二列。
如果indkey
包含{4,3},那么表的第四列是索引中的第一列,而表的第三列是索引'第二列。
答案 2 :(得分:1)
这是一个查询,当您按表搜索时检索索引上的位置:
select
c.relname as tabela,
a.relname as indexname,
d.attname as coluna,
(
select
temp.i + 1
from
(
SELECT generate_series(array_lower(b.indkey,1),array_upper(b.indkey,1)) as i
) temp
where
b.indkey[i] = d.attnum
) as posicao
from
pg_class a
inner join
pg_index b
on
a.oid = b.indexrelid
inner join
pg_class c
on
b.indrelid = c.oid
inner join
pg_attribute d
on
c.oid = d.attrelid and
d.attnum = any(b.indkey)
where
b.indisprimary != true and
a.relname not like 'pg_%'
order by
tabela, indexname, posicao
答案 3 :(得分:0)
只需使用array_position()
函数即可在indkey
数组中获取所需的列索引:
select c.relname, a.attname,
array_position(i.indkey, a.attnum)
from pg_index i
join pg_class c
on c.oid = i.indexrelid
and c.relkind = 'i'
join pg_attribute a
on a.attrelid = 'your_table'::regclass::oid
and a.attnum = any(i.indkey)
where indrelid = 'your_table'::regclass::oid
order by 1, 2;