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


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.


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'

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.


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'))

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.