2013-04-15 2 views
3

Как выполнить запрос (по внутренним таблицам PostgreSQL) для получения условного выражения для частичного индекса (roles_user_group_role_idx ниже в этом случае).postgresql - Получить частичный индекс WHERE выражение

# \d roles 
           Table "public.roles" 
    Column  |   Type    |    Modifiers    
---------------+-----------------------------+--------------------------------------- 
id   | character varying(15)  | not null default next_id('r'::bpchar) 
user_id  | character varying(15)  | not null 
group_id  | character varying(15)  | not null 
role   | character varying(255)  | not null 
language_code | character varying(2)  | 
created_at | timestamp without time zone | not null 
updated_at | timestamp without time zone | not null 
Indexes: 
    "roles_pkey" PRIMARY KEY, btree (id) 
    "roles_user_group_role_idx" UNIQUE, btree (user_id, group_id, role) WHERE language_code IS NULL 

Согласно PostgreSQL pg_index doc, pg_index.indpred кажется поле мне нужно смотреть. Выполнение этого запроса:

SELECT 
    C.oid, 
    I.indpred 
FROM pg_catalog.pg_class C, 
    pg_catalog.pg_namespace N, 
    pg_catalog.pg_index I 
WHERE C.relname = 'roles_user_group_role_idx' 
    AND C.relnamespace = N.oid 
    AND I.indexrelid = C.oid 
    AND N.nspname = 'public'; 

дает мне это, что не совсем там.

oid |                     indpred                     
---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
1235504 | {NULLTEST :arg {VAR :varno 1 :varattno 5 :vartype 1043 :vartypmod 6 :varcollid 100 :varlevelsup 0 :varnoold 1 :varoattno 5 :location 95} :nulltesttype 0 :argisrow false} 

Я в правильном направлении? Как получить предложение WHERE частичного индекса? Я использую PG 9.2

ответ

6

OK после того, как немного прибегая к помощи я нашел ответ here, правильный запрос:

SELECT 
    C.oid, 
    pg_get_expr(I.indpred, I.indrelid) 
FROM pg_catalog.pg_class C, 
    pg_catalog.pg_namespace N, 
    pg_catalog.pg_index I 
WHERE C.relname = 'roles_user_group_role_idx' 
    AND C.relnamespace = N.oid 
    AND I.indexrelid = C.oid 
    AND N.nspname = 'public'; 

результат:

oid |  pg_get_expr  
---------+------------------------- 
1235504 | (language_code IS NULL) 
Смежные вопросы