2012-04-10 20 views
1

我創建了一個SQL SELECT來獲取所有枚舉和它們的值在一個模式:Postgres的:可變的說法從架構我選擇

SELECT 
    t.typname, array_agg(e.enumlabel) 
FROM pg_type t 
JOIN pg_enum e ON t.oid = e.enumtypid 
JOIN pg_namespace n ON t.typnamespace = n.oid 
WHERE t.typtype = 'e' AND n.nspname = 'public' 
GROUP BY typname 

我已經把選擇到視圖所以我沒有寫它每次我想打電話給它。困擾我的唯一的事情是,如果我重新命名模式或其他模式我必須手動改寫模式的名稱使用它,檢查代碼的行6:

WHERE t.typtype = 'e' AND n.nspname = 'public' 

公共的hardtyped那裏。在postgres中選擇時,是否有一個「全局」變量表示您選擇哪種模式?我無法找到任何。

由於

PS:我用postgres的8.4

回答

4

當前模式可以使用函數current_schema()

http://www.postgresql.org/docs/current/static/functions-info.html

+0

謝謝,這正是我一直在尋找並感謝糾正拼寫:)我總是困惑是否使用Postgre或Postgres的 – Santhos 2012-04-10 15:03:31

+0

嘛,正式這是PostgreSQL的,但Postgres的是一個普遍的綽號。甚至許多使用官方拼寫*的人也會發音,就像更短的形式。 (我這樣做)http://wiki.postgresql.org/wiki/FAQ#What_is_PostgreSQL.3F_How_is_it_pronounced.3F_What_is_Postgres.3F – kgrittn 2012-04-10 15:33:13

+0

@Santhos:除了kgrittn的評論:Postgre(沒有s)是**從不** **正確 – 2012-04-10 15:34:36

0

替代於佈線架構或與CURRENT_SCHEMA尋找它(被檢索),您可以通過架構來創建視圖組,然後在視圖上選擇。

create or replace view enum_vw as 
SELECT 
    n.nspname, t.typname, array_agg(e.enumlabel) 
FROM pg_type t 
JOIN pg_enum e ON t.oid = e.enumtypid 
JOIN pg_namespace n ON t.typnamespace = n.oid 
WHERE t.typtype = 'e' 
GROUP BY n.nspname, t.typname; 

select * from enum_vw where nspname = 'public'; 
+0

這也可以,但我想要一個乾淨的樣子:enum_name => enum_values。命名空間的名稱並不令我感興趣。我只需要使它在每個模式下都能正常工作,這就是爲什麼current_schema()是我一直在尋找的東西。無論如何,我很欣賞你的低調。謝謝 – Santhos 2012-04-11 08:26:59