The permintaan menyarankan untuk jenis ENUM daftar besar. Tapi, itu hanya daftar dari schema
dan typname
. Bagaimana cara mencantumkan nilai ENUM yang sebenarnya? Misalnya, dalam jawaban yang ditautkan di atas, saya menginginkan hasil sebagai berikut
schema type values
------------- -------- -------
communication channels 'text_message','email','phone_call','broadcast'
postgresql
punkish
sumber
sumber
string_agg(e.enumlabel, ', ') as enum_value
dengan yang sesuaiGROUP BYs
. Terimakasih banyak.Anda dapat membuat daftar tipe data melalui
https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS
sumber
select enum_range(enum_first(null::province),null::province);
sumber
select unnest(enum_range(null, null::name_of_enum_type));
untuk mendapatkan satu nilai per baris.select enum_range(null::my_enum)
. postgresql.org/docs/9.5/static/functions-enum.htmlSaya selalu lupa bagaimana melakukan ini. Sesuai jawaban dan komentar lainnya, ini dia daftar yang dipisahkan koma. Saya suka potongan salin-tempel. Terima kasih untuk bantuannya:
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;
sumber
Ini:
SELECT unnest(enum_range(NULL::myenum))
mengembalikan jenis enum sebagai baris.sumber
@dpb:
Jika Anda ingin membuat metode akses mudah permanen untuk ini, Anda selalu dapat membuat tampilan
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;
Anda kemudian dapat membuat pemicu untuk perintah sisipkan.
Di atas akan menyimpan ini dalam database untuk tujuan referensi di masa mendatang.
sumber
Ini mencantumkan semua kolom yang diketik enum dan nilai potensinya:
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;
sumber
Tambahkan pesanan
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;
sumber
Jika Anda memiliki nama tabel dan kolom, (tapi bukan nama tipe) gunakan ini:
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
Jika Anda menggunakan
enum_range
pada kolom (berbeda dengan jawaban lain yang menggunakannya pada sebuah tipe) itu akan mengembalikan data untuk setiap baris yang ada, yang bukan yang Anda inginkan. Jadi gunakan kueri di atas sebagai gantinya.sumber
pg_namespace
, ini menghasilkan asosiasi yang salah jika nama enum yang sama ada di lebih dari satu skema ...