list Тип Postgres ENUM


100

Предложил запрос в список типов ENUM велик. Но, это просто списки schemaи typname. Как мне перечислить фактические значения ENUM? Например, в приведенном выше ответе я хотел бы получить следующий результат

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

Ответы:


134
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


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

11
Сработало как шарм, для других «провинция» - это имя типа перечисления :)
Rana Deep

14
Используйте, select unnest(enum_range(null, null::name_of_enum_type));чтобы получить одно значение в строке.
Брайан Х,

16
Благодарность! Согласно документам, вам не нужно повторять это дважды, если вы хотите весь диапазон select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Сэм Итон,

15

Я всегда забываю, как это делать. Согласно другому ответу и комментарию, здесь это список, разделенный запятыми. Мне нравятся фрагменты копипаста. Спасибо за помощь:

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, это приводит к неправильным ассоциациям, если одно и то же имя перечисления присутствует в более чем одной схеме ...
blubb
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.