Zapytanie SQL, aby uzyskać wszystkie wartości, które może mieć wyliczenie

140

Postgresql już jakiś czas temu otrzymał wsparcie dla enum.

CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);

Jak uzyskać wszystkie wartości określone w wyliczeniu za pomocą zapytania?

Wienczny
źródło
Bardzo pomocna okazała się również następująca odpowiedź: stackoverflow.com/questions/9540681/list-postgres-enum-type
anonimowy tchórz

Odpowiedzi:

264

Jeśli chcesz mieć tablicę:

SELECT enum_range(NULL::myenum)

Jeśli chcesz mieć osobny rekord dla każdego elementu w wyliczeniu:

SELECT unnest(enum_range(NULL::myenum))  

Dodatkowe informacje

To rozwiązanie działa zgodnie z oczekiwaniami, nawet jeśli wyliczenie nie znajduje się w schemacie domyślnym. Na przykład, należy wymienić myenumzmyschema.myenum .

Typ danych zwracanych rekordów w powyższym zapytaniu będzie myenum. W zależności od tego, co robisz, może być konieczne przesłanie do tekstu. na przykład

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

Jeśli chcesz określić nazwę kolumny, możesz dołączyć AS my_col_name.


Podziękowania dla Justina Ohmsa za wskazanie kilku dodatkowych wskazówek, które włączyłem do mojej odpowiedzi.

Chris L.
źródło
1
Ta odpowiedź jest znacznie bardziej zwięzła. Niezły wkład!
Darin Peterson
3
Nieniszczone wywołanie zwróci rekordy typu myenum z nazwą kolumny „myenum”. Możesz również rzucić wyliczenie na tekst i określić nazwę kolumny, dodając coś podobnego. :: text AS my_column
Justin Ohms
1
Aby dowiedzieć się więcej o funkcjach wyliczenia, możesz wyświetlić ten link postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet
1
jakie jest znaczenie NULL::?
Sung Cho
1
@ChrisL thanks. wydaje się to bardzo dziwne. dlaczego nie możemy tego zrobić SELECT enum_range(myenum)? Jakie jest znaczenie castingu null?
Sung Cho,
31

Próbować:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
Kev
źródło
1
Jeśli masz to samo wyliczenie w więcej niż jednym schemacie, może to wymagać nieco zawężenia. Jeśli tak jest, zobacz postgresql.org/docs/current/static/catalog-pg-type.html, aby uzyskać szczegółowe informacje.
Kev
1
Myślę, że należy poprzedzić „myenum” podkreśleniem. Sprawdź moją odpowiedź, jeśli chcesz uzyskać wartości wyliczenia, a nazwa wyliczenia może być używana w więcej niż jednym schemacie.
David Underhill,
Jeśli kolejność wyliczeń jest ważna, dołącz ORDER BY e.enumsortorderdo zapytania. Wyliczone wartości będą najprawdopodobniej nie w kolejności, jeśli nowe wartości zostały wstawione do typu wyliczenia przy użyciu BEFORElub AFTER.
Clint Pachl
5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

To zwróci pojedynczy zestaw wyników kolumny zawierający zawartość wyliczenia „twoje_enum” z kolumną o nazwie „twoja_kolumna” typu tekst.

Justin Ohms
źródło
4

Możesz pobrać wszystkie wartości wyliczenia dla wyliczenia przy użyciu następującego zapytania. Zapytanie umożliwia wybranie przestrzeni nazw, w której znajduje się wyliczenie (co jest wymagane, jeśli wyliczenie jest zdefiniowane w wielu przestrzeniach nazw; w przeciwnym razie można pominąć tę część zapytania).

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'))
David Underhill
źródło
1
Co masz na myśli, mówiąc, że jest to typ tablicy? U mnie to działa (PostgreSQL 9.0).
David Underhill,
+1 To zadziałało dla mnie, podczas gdy odpowiedź @ Kev nie zadziałała, ze względu na użycie schematów w mojej bazie danych.
user9645,