Postgres ENUM 유형 나열


98

ENUM 유형을 나열 하는 제안 된 쿼리 는 훌륭합니다. 그러나 그것은 단지 schematypname. 실제 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. 감사합니다.
punkish

4
이건 말도 안돼. 도대체 왜 속기가 없습니까? (그래도 솔루션에 감사드립니다!)
dpb


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

11
매력처럼 일했고 다른 사람들에게는 'province'가 열거 형 이름입니다. :)
Rana Deep

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
Sam Eaton

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.