Permintaan SQL untuk mendapatkan semua nilai yang bisa dimiliki oleh enum

140

Postgresql mendapat dukungan enum beberapa waktu lalu.

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

Bagaimana cara mendapatkan semua nilai yang ditentukan dalam enum dengan kueri?

Wienczny
sumber
Saya juga menemukan jawaban berikut ini sangat membantu: stackoverflow.com/questions/9540681/list-postgres-enum-type
pengecut anonim

Jawaban:

264

Jika Anda menginginkan sebuah array:

SELECT enum_range(NULL::myenum)

Jika Anda ingin catatan terpisah untuk setiap item dalam enum:

SELECT unnest(enum_range(NULL::myenum))  

informasi tambahan

Solusi ini berfungsi seperti yang diharapkan bahkan jika enum Anda tidak ada dalam skema default. Misalnya, ganti myenumdengan myschema.myenum.

Tipe data catatan yang dikembalikan dalam kueri di atas adalah myenum. Tergantung pada apa yang Anda lakukan, Anda mungkin perlu membaca. misalnya

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

Jika Anda ingin menentukan nama kolom, Anda dapat menambahkan AS my_col_name.


Penghargaan untuk Justin Ohms karena menunjukkan beberapa tips tambahan, yang saya masukkan ke dalam jawaban saya.

Chris L.
sumber
1
Jawaban ini jauh lebih ringkas. Kontribusi yang bagus!
Darin Peterson
3
Panggilan yang tidak masuk akal akan mengembalikan catatan tipe myenum dengan nama kolom "myenum". Anda mungkin juga ingin memberikan enum ke teks dan menentukan nama kolom dengan menambahkan sesuatu seperti. :: text AS my_column
Justin Ohms
1
Untuk memahami lebih lanjut tentang fungsi enum, Anda dapat melihat tautan ini postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet
1
apa artinya NULL::?
Sung Cho
1
@ Chris, terima kasih. sepertinya sangat aneh. mengapa kita tidak bisa melakukannya SELECT enum_range(myenum)? Apa arti casting null?
Sung Cho
31

Mencoba:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'
Kev
sumber
1
Jika Anda memiliki enum yang sama dalam lebih dari satu skema, ini mungkin perlu dipersempit sedikit. Jika itu masalahnya, lihat postgresql.org/docs/current/static/catalog-pg-type.html untuk detailnya.
Kev
1
Saya pikir Anda perlu awalan 'myenum' dengan garis bawah. Lihat jawaban saya jika Anda perlu mendapatkan nilai enum dan nama enum dapat digunakan di lebih dari satu skema.
David Underhill
Jika urutan enumerasi penting, tambahkan ORDER BY e.enumsortorderkueri. Nilai enumerasi kemungkinan besar akan rusak jika nilai baru dimasukkan ke dalam jenis enumerasi menggunakan BEFOREatau AFTER.
Clint Pachl
5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

Ini akan mengembalikan satu set hasil kolom tunggal dari isi enum "your_enum" dengan kolom bernama "your_column" dari jenis teks.

Justin Ohms
sumber
4

Anda bisa mendapatkan semua nilai enum untuk enum menggunakan kueri berikut. Kueri memungkinkan Anda memilih namespace tempat enum hidup juga (yang diperlukan jika enum didefinisikan dalam beberapa ruang nama; jika tidak, Anda dapat menghilangkan bagian dari kueri itu).

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
sumber
1
Apa maksud Anda bahwa itu adalah jenis array? Ini berfungsi untuk saya (PostgreSQL 9.0).
David Underhill
+1 Ini berfungsi untuk saya sedangkan jawaban @ Kev tidak, karena penggunaan skema di DB saya.
user9645