список Postgres типу ENUM


98

Запропонував запит в список типів ENUM великий. Але, це лише переліки schemaі typname. Як перерахувати фактичні значення ENUM? Наприклад, у зв’язаній відповіді вище, я хотів би отримати такий результат

schema         type      values
-------------  --------  -------
communication  channels  'text_message','email','phone_call','broadcast'

Відповіді:


133
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

4
солодке ... ще краще використовувати string_agg(e.enumlabel, ', ') as enum_valueз відповідним GROUP BYs. Дуже дякую.
панк

4
Це смішно. Чому на землі не існує скорочення? (Хоча дякую за рішення!)
dpb


70
select enum_range(enum_first(null::province),null::province);

11
Працювало як шарм, для інших "провінція" - це назва типу enum :)
Рана Глибока

14
Використовуйте select unnest(enum_range(null, null::name_of_enum_type));для отримання одного значення в рядку.
Brian H

16
Дякую! Згідно з документами, вам не потрібно повторювати це двічі, якщо ви хочете весь діапазон select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Сем Ітон

15

Я завжди забуваю, як це зробити. Що стосується іншої відповіді та коментаря, тут це список, відокремлений комами. Мені подобаються фрагменти copy-paste. Дякую за допомогу:

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;


0

@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;

Потім ви можете створити тригер для команди вставки.

Вищевказане буде зберігати це в базі даних для подальших довідкових цілей.


0

Тут перераховані всі стовпці, введені в перелік, та їх потенційні значення:

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;

0

Додати замовлення

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
ORDER BY
  enum_name,
  e.enumsortorder;

-2

Якщо у вас є ім’я таблиці та стовпця (але не ім’я типу), використовуйте це:

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стовпець (на відміну від інших відповідей, які використовували його для типу), він поверне дані для кожного існуючого рядка, а це не те, що ви хочете. Тому використовуйте замість цього наведений вище запит.


1
Оскільки ви не приєднуєтесь pg_namespace, це призводить до неправильних асоціацій, якщо одне і те ж ім'я
перелічується
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.