daftar tipe Postgres ENUM


101

The permintaan menyarankan untuk jenis ENUM daftar besar. Tapi, itu hanya daftar dari schemadan 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'

Jawaban:


135
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

4
manis ... lebih baik digunakan string_agg(e.enumlabel, ', ') as enum_valuedengan yang sesuai GROUP BYs. Terimakasih banyak.
punkish

4
Ini konyol. Mengapa tidak ada tulisan cepat? (Terima kasih atas solusinya!)
dpb


71
select enum_range(enum_first(null::province),null::province);

11
Bekerja seperti pesona, bagi orang lain, 'provinsi' adalah nama tipe enum :)
Rana Deep

14
Gunakan select unnest(enum_range(null, null::name_of_enum_type));untuk mendapatkan satu nilai per baris.
Brian H

16
Terima kasih! Menurut dokumen Anda tidak perlu mengulanginya dua kali jika Anda menginginkan keseluruhan rentang select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton

15

Saya 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;


0

@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.


0

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;

0

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;

-2

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_rangepada 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.


1
Karena Anda tidak bergabung pg_namespace, ini menghasilkan asosiasi yang salah jika nama enum yang sama ada di lebih dari satu skema ...
blubb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.