รายการ Postgres ประเภท ENUM


100

แบบสอบถามแนะนำให้รายการประเภท ENUMเป็นที่ดี แต่เป็นเพียงรายการของschemaและtypname. ฉันจะแสดงรายการค่า ENUM จริงได้อย่างไร ตัวอย่างเช่นในคำตอบที่เชื่อมโยงด้านบนฉันต้องการผลลัพธ์ต่อไปนี้

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

คำตอบ:


134
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
หวาน ... แม้ดีกว่าที่จะใช้กับที่เหมาะสมstring_agg(e.enumlabel, ', ') as enum_value GROUP BYsขอบคุณมาก.
punkish

4
นี่มันไร้สาระ ทำไมบนโลกถึงไม่มีชวเลข? (ขอบคุณสำหรับวิธีแก้ปัญหา!)
dpb

92

คุณสามารถแสดงประเภทข้อมูลผ่านทาง

\dT+ channels

https://www.postgresql.org/docs/current/static/app-psql.html#APP-PSQL-META-COMMANDS


@AlisonR. ฉันเชื่อว่าผู้เขียนกำลังมองหาไวยากรณ์ sql คำตอบในคำตอบนี้ใช้ได้เฉพาะกับไคลเอนต์ postgres cli
Slava

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

11
ทำงานอย่างมีเสน่ห์สำหรับคนอื่น 'จังหวัด' คือชื่อประเภท enum :)
Rana Deep

14
ใช้select unnest(enum_range(null, null::name_of_enum_type));เพื่อรับหนึ่งค่าต่อแถว
Brian H

16
ขอบคุณ! select enum_range(null::my_enum)ตามเอกสารที่คุณไม่จำเป็นต้องทำซ้ำเป็นครั้งที่สองถ้าคุณต้องการทั้งช่วง postgresql.org/docs/9.5/static/functions-enum.html
Sam Eaton

15

ฉันมักจะลืมวิธีการทำเช่นนี้ ตามคำตอบอื่น ๆ และความคิดเห็นนี่คือรายการที่คั่นด้วยจุลภาค ฉันชอบข้อมูลโค้ดคัดลอกวาง ขอบคุณสำหรับความช่วยเหลือ:

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:

หากคุณต้องการสร้างวิธีการเข้าถึงที่ง่ายแบบถาวรสำหรับสิ่งนี้คุณสามารถสร้างมุมมองได้ตลอดเวลา

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;

จากนั้นคุณสามารถสร้างทริกเกอร์สำหรับคำสั่งแทรก

ข้างต้นจะเก็บสิ่งนี้ไว้ในฐานข้อมูลเพื่อวัตถุประสงค์ในการอ้างอิงในอนาคต


0

รายการนี้แสดงคอลัมน์ enum-typed ทั้งหมดและค่าที่เป็นไปได้:

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

เพิ่มคำสั่งซื้อ

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

หากคุณมีชื่อตารางและคอลัมน์ (แต่ไม่มีชื่อประเภท) ให้ใช้สิ่งนี้:

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

หากคุณใช้enum_rangeกับคอลัมน์ (ตรงกันข้ามกับคำตอบอื่น ๆ ที่ใช้กับประเภท) ระบบจะส่งคืนข้อมูลสำหรับแต่ละแถวที่มีอยู่ซึ่งไม่ใช่สิ่งที่คุณต้องการ ดังนั้นให้ใช้แบบสอบถามด้านบนแทน


1
เนื่องจากคุณไม่ได้เข้าร่วมpg_namespaceจึงทำให้เกิดการเชื่อมโยงที่ไม่ถูกต้องหากมีชื่อ enum เดียวกันในสคีมามากกว่าหนึ่งสคีมา ...
blubb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.