列的位置在索引中

时间:2011-09-09 13:12:59

标签: postgresql

如何在PostgreSQL数据库的索引中获取列的位置? pg_index目录表中的indkey给出了该列表中该列的位置,但我希望列中的列的位置包含索引。

4 个答案:

答案 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;