2011-09-09 63 views
2

如何獲取PostgreSQL數據庫中索引中列的位置? pg_index目錄表中的indkey提供了該列在表格中的位置,但是我希望列中包含索引的位置。列在索引中的位置

回答

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是索引的名稱。

+0

+1比我的回答更好的解決方案。 –

+0

但是,查看名爲「indkey」的東西比加入pg_class和pg_attribute更有意義。我討厭系統表。每次看到他們,我都覺得我的名字是愛麗絲,而我剛剛穿過鏡子。 –

1

indkey是一個數組,並且該數組中條目的順序決定了索引列的順序。

因此,如果indkey包含{2,4},那麼表中的第二列首先出現在索引中,而表的第四列是索引中的第二列。

如果indkey包含{4,3},那麼表的第四列是索引中的第一列,而表的第三列是索引的第二列。

+0

@Catcall從一個簡單的測試,該解決方案適合我。我必須對此進行一些調整才能使用它。 – vchitta

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 
+0

李嘉圖的答案確實是我需要的答案。您需要在向量pg_index.indkey中找到pg_attribute.attnum的位置(表格中列的位置)。這會給你索引中列的位置。 –

+0

當您查詢索引中具有自己表的列的attnum時,Mike的解決方案是正確的。 Mike's可以讓你通過索引進行查詢,這可以讓你通過表進行查詢。 – Logan