danh sách Postgres loại ENUM


98

Các truy vấn gợi ý để loại ENUM danh sách là rất tốt. Nhưng, nó chỉ đơn thuần là danh sách các schematypname. Làm cách nào để liệt kê các giá trị ENUM thực tế? Ví dụ: trong câu trả lời được liên kết ở trên, tôi muốn kết quả sau

schema         type      values
-------------  --------  -------
communication  channels  'text_message','email','phone_call','broadcast'

Câu trả lời:


133
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
ngọt ngào ... thậm chí tốt hơn để sử dụng string_agg(e.enumlabel, ', ') as enum_valuevới thích hợp GROUP BYs. Cảm ơn nhiều.
punkish

4
Chuyện này thật vớ vẩn. Tại sao trên trái đất không có tốc ký? (Cảm ơn vì giải pháp!)
dpb


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

11
Làm việc như một nét duyên dáng, cho người khác, 'tỉnh' là tên kiểu enum :)
Rana sâu

14
Sử dụng select unnest(enum_range(null, null::name_of_enum_type));để nhận một giá trị trên mỗi hàng.
Brian H

16
Cảm ơn! Theo tài liệu, bạn không cần phải lặp lại nó hai lần nếu bạn muốn toàn bộ phạm vi select enum_range(null::my_enum). postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton

15

Tôi luôn quên làm thế nào để làm điều này. Theo câu trả lời khác và nhận xét, đây là danh sách được phân tách bằng dấu phẩy. Tôi thích các đoạn mã sao chép-dán. Cảm ơn đã giúp đỡ:

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:

Nếu bạn muốn tạo một phương pháp truy cập dễ dàng vĩnh viễn cho việc này, bạn luôn có thể tạo một chế độ xem

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;

Sau đó, bạn có thể tạo một trình kích hoạt cho lệnh chèn.

Ở trên sẽ lưu trữ điều này trong cơ sở dữ liệu cho các mục đích tham khảo trong tương lai.


0

Điều này liệt kê tất cả các cột được nhập và giá trị tiềm năng của chúng:

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

Thêm đơn hàng

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

Nếu bạn có tên bảng và cột, (nhưng không phải tên loại), hãy sử dụng:

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

Nếu bạn sử dụng enum_rangetrên một cột (trái ngược với các câu trả lời khác đã sử dụng nó trên một loại), nó sẽ trả về dữ liệu cho mỗi hàng tồn tại, đây không phải là những gì bạn muốn. Vì vậy, hãy sử dụng truy vấn trên để thay thế.


1
Vì bạn không tham gia pg_namespace, điều này dẫn đến các liên kết sai nếu cùng một tên enum có trong nhiều giản đồ ...
blubb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.