열거 형이 가질 수있는 모든 값을 가져 오는 SQL 쿼리


답변:


264

배열을 원한다면 :

SELECT enum_range(NULL::myenum)

열거 형의 각 항목에 대해 별도의 레코드를 원하는 경우 :

SELECT unnest(enum_range(NULL::myenum))  

추가 정보

이 솔루션은 열거 형이 기본 스키마에없는 경우에도 예상대로 작동합니다. 예를 들어, 교체 myenum와 함께 myschema.myenum.

위 쿼리에서 반환 된 레코드의 데이터 형식은 myenum입니다. 수행중인 작업에 따라 텍스트로 전송해야 할 수도 있습니다. 예 :

SELECT unnest(enum_range(NULL::myenum))::text

열 이름을 지정하려면을 추가 할 수 있습니다 AS my_col_name.


추가 답변을 지적 해준 Justin Ohms에게 감사의 말을 전합니다.


1
이 답변은 훨씬 간결합니다. 좋은 공헌!
Darin Peterson

3
Nest 호출은 열 이름이 "myenum"인 myenum 유형의 레코드를 리턴합니다. 열거 형을 텍스트로 캐스팅하고 비슷한 것을 추가하여 열 이름을 지정할 수도 있습니다. :: text as my_column
Justin Ohms

1
열거 함수에 대한 자세한 이해하려면이 링크를 볼 수 있습니다 postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal 바스 넷

1
의 의미는 NULL::무엇입니까?
Sung Cho

1
@ChrisL 감사합니다. 매우 이상해 보인다. 왜 안돼 SELECT enum_range(myenum)? 캐스팅의 의미는 무엇입니까 null?
Sung Cho

31

시험:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'

1
둘 이상의 스키마에 동일한 열거 형이 있으면 조금 좁혀 야 할 수도 있습니다. 이 경우 자세한 내용 은 postgresql.org/docs/current/static/catalog-pg-type.html 을 참조하십시오.
Kev

1
밑줄로 'myenum'을 접두사로 사용해야한다고 생각합니다. 열거 형 값을 가져 와야하고 열거 형 이름이 둘 이상의 스키마에서 사용될 수 있다면 내 대답을 확인하십시오.
David Underhill

열거 순서가 중요한 ORDER BY e.enumsortorder경우 쿼리에 추가 하십시오. 새 값을 사용하여 열거 형에 삽입 된 경우 열거 값이 가장 가능성이 순서가 될 것이다 BEFOREAFTER.
클린트 Pachl

5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

그러면 텍스트 유형이 "your_column"인 열과 함께 "your_enum"열거 내용의 단일 열 결과 집합이 반환됩니다.


4

다음 쿼리를 사용하여 열거 형에 대한 모든 열거 형 값을 가져올 수 있습니다. 쿼리를 사용하면 열거 형이 존재하는 네임 스페이스를 선택할 수 있습니다 (이 열거 형이 여러 네임 스페이스에 정의 된 경우 필요합니다. 그렇지 않으면 쿼리의 해당 부분을 생략 할 수 있음).

SELECT enumlabel
FROM pg_enum
WHERE enumtypid=(SELECT typelem
                 FROM pg_type
                 WHERE typname='_myenum' AND
                 typnamespace=(SELECT oid
                               FROM pg_namespace
                               WHERE nspname='myschema'))

1
이것이 배열 유형이라는 것은 무엇을 의미합니까? 이것은 나를 위해 작동합니다 (PostgreSQL 9.0).
David Underhill

+1 이것은 나를 위해 일한 반면 @Kev의 대답은 내 DB에서 스키마를 사용했기 때문에 그렇지 않았습니다.
user9645
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.