список Postgres ENUM тип - PullRequest
       4

список Postgres ENUM тип

63 голосов
/ 03 марта 2012

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

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

Ответы [ 7 ]

96 голосов
/ 03 марта 2012
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
55 голосов
/ 24 мая 2015
select enum_range(enum_first(null::province),null::province);
42 голосов
/ 16 февраля 2018

Вы можете перечислить тип данных через

\dT+ channels

https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS

12 голосов
/ 31 октября 2012

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

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 голосов
/ 12 декабря 2017

Здесь перечислены все перечисляемые столбцы и их потенциальные значения:

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 голосов
/ 01 мая 2017

Если у вас есть имя таблицы и столбца (но не имя типа), используйте это:

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

0 голосов
/ 03 июня 2015

@ РОП:

Если вы хотите создать постоянный метод легкого доступа для этого, вы всегда можете создать представление

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;

Затем можно создать триггер для команды вставки.

Выше будет хранить это в базе данных для будущих справочных целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...