該suggested query to list ENUM types是偉大的。但是,它只是列出了schema
和typname
。如何列出實際的ENUM值?例如,在上面的鏈接的答案,我希望下面的結果列表Postgres ENUM類型
schema type values
------------- -------- -------
communication channels 'text_message','email','phone_call','broadcast'
該suggested query to list ENUM types是偉大的。但是,它只是列出了schema
和typname
。如何列出實際的ENUM值?例如,在上面的鏈接的答案,我希望下面的結果列表Postgres ENUM類型
schema type values
------------- -------- -------
communication channels 'text_message','email','phone_call','broadcast'
select n.nspname as enum_schema,
t.typname as enum_name,
e.enumlabel as enum_value
from pg_type t
join pg_enum e on t.oid = e.enumtypid
join pg_catalog.pg_namespace n ON n.oid = t.typnamespace
我總是忘了如何做到這一點。根據其他答案和評論,這裏是以逗號分隔的列表。我喜歡複製粘貼片段。謝謝您的幫助。
select n.nspname as enum_schema,
t.typname as enum_name,
string_agg(e.enumlabel, ', ') as enum_value
from pg_type t
join pg_enum e on t.oid = e.enumtypid
join pg_catalog.pg_namespace n ON n.oid = t.typnamespace
group by enum_schema, enum_name
select enum_range(enum_first(null::province),null::province);
像其他人一樣工作,'省'是枚舉類型名稱:) – 2015-06-30 11:45:29
男人,你很酷 – Andrey 2016-01-15 19:06:14
使用'select unnest(enum_range(null,null :: name_of_enum_type));'爲每行獲取一個值。 – 2016-02-01 14:17:23
@dpb:
如果你想爲此創建永久輕鬆訪問方法,你總是可以創建一個視圖
CREATE OR REPLACE VIEW oublic.enumz AS
SELECT n.nspname AS enum_schema,
t.typname AS enum_name,
e.enumlabel AS enum_value
FROM pg_type t
JOIN pg_enum e ON t.oid = e.enumtypid
JOIN pg_namespace n ON n.oid = t.typnamespace;
然後,您可以創建一個觸發器插入命令。
上述內容將存儲在數據庫中以備將來參考。
如果你有表和列名,(但不是類型名稱)使用此:
SELECT pg_enum.enumlabel
FROM pg_type
JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid
JOIN information_schema.columns ON information_schema.columns.udt_name =
pg_type.typname
WHERE pg_type.typtype = 'e' AND
table_name = $1 AND column_name = $2 ORDER BY pg_enum.enumsortorder
如果您在列中使用enum_range
(相反,該用它在一個類型的其他答案)它會返回存在的每一行的數據,這不是你想要的。因此,請改用上述查詢。
由於您不加入'pg_namespace',這會導致錯誤的關聯,如果同一個枚舉名稱存在於多個模式... – blubb 2017-12-12 14:10:07
此列出所有枚舉類型的列及其潛在價值:
SELECT
table_schema || '.' || table_name || '.' || column_name as field_name,
pg_enum.enumlabel as value
FROM pg_type
JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid
JOIN pg_namespace on pg_type.typnamespace = pg_namespace.oid
JOIN information_schema.columns ON (information_schema.columns.udt_name = pg_type.typname AND information_schema.columns.udt_schema = pg_namespace.nspname)
WHERE pg_type.typtype = 'e'
ORDER BY field_name, pg_enum.enumsortorder;
你可以列出的數據類型通過
\dT+ channels
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
甜......甚至更好使用'string_agg(e.enumlabel,',')作爲enum_value'和相應的'GROUP BYs'。非常感謝。 – punkish 2012-03-02 21:44:35
這太可笑了。爲什麼地球上沒有速記? (感謝您的解決方案!) – dpb 2015-05-26 23:50:39
@dpb:您可以在psql命令行客戶端中使用'\ dT +' – 2015-05-27 05:37:03