แบบสอบถาม SQL เพื่อรับค่าทั้งหมดที่ enum สามารถมีได้


140

Postgresql ได้รับการสนับสนุน enum บางเวลาที่ผ่านมา

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

ฉันจะรับค่าทั้งหมดที่ระบุใน enum ด้วยแบบสอบถามได้อย่างไร


ฉันยังได้พบคำตอบต่อไปนี้เป็นประโยชน์มาก: stackoverflow.com/questions/9540681/list-postgres-enum-type
คนขี้ขลาดนิรนาม

คำตอบ:


264

ถ้าคุณต้องการอาร์เรย์:

SELECT enum_range(NULL::myenum)

หากคุณต้องการบันทึกแยกต่างหากสำหรับแต่ละรายการใน enum:

SELECT unnest(enum_range(NULL::myenum))  

ข้อมูลเพิ่มเติม

โซลูชันนี้ทำงานได้ตามที่คาดไว้แม้ว่า enum ของคุณจะไม่อยู่ในสคีมาเริ่มต้น ยกตัวอย่างเช่นแทนที่ด้วยmyenummyschema.myenum

myenumชนิดข้อมูลของระเบียนที่ส่งคืนในแบบสอบถามดังกล่าวข้างต้นจะเป็น ขึ้นอยู่กับสิ่งที่คุณกำลังทำคุณอาจต้องส่งข้อความ เช่น

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

AS my_col_nameหากคุณต้องการที่จะระบุชื่อคอลัมน์คุณสามารถผนวก


ให้เครดิตกับ Justin Ohms สำหรับการชี้เคล็ดลับเพิ่มเติมซึ่งฉันได้รวมไว้ในคำตอบของฉัน


1
คำตอบนี้สั้นกระชับกว่านี้มาก มีส่วนร่วมที่ดี!
ดารินปีเตอร์สัน

3
การโทรที่ไม่ถูกต้องจะส่งกลับระเบียนประเภท myenum ด้วยชื่อคอลัมน์ "myenum" คุณอาจต้องการแปลง enum เป็นข้อความและระบุชื่อคอลัมน์โดยเพิ่มสิ่งที่ชอบ :: text AS my_column
Justin Ohms

1
เพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับฟังก์ชั่น enum คุณสามารถดูลิงค์นี้postgresql.org/docs/8.3/static/functions-enum.html postgresql.org/docs/9.2/static/functions-array.html
Bikal Basnet

1
ความหมายของNULL::อะไร
Sung Cho

1
@ChrisL ขอบคุณ ดูเหมือนแปลกมาก ทำไมเราทำSELECT enum_range(myenum)ไม่ได้ ความหมายของการคัดเลือกนักแสดงnullคืออะไร?
Sung Cho

31

ลอง:

SELECT e.enumlabel
  FROM pg_enum e
  JOIN pg_type t ON e.enumtypid = t.oid
  WHERE t.typname = 'myenum'

1
หากคุณมี enum เดียวกันมากกว่าหนึ่งสคีมาสิ่งนี้อาจต้องแคบลงเล็กน้อย หากเป็นกรณีดังกล่าวโปรดดูpostgresql.org/docs/current/static/catalog-pg-type.htmlเพื่อดูรายละเอียด
Kev

1
ฉันคิดว่าคุณต้องใส่คำนำหน้า 'myenum' ด้วยเครื่องหมายขีดล่าง ตรวจสอบคำตอบของฉันหากคุณต้องการรับค่า enum และอาจใช้ชื่อ enum ในสคีมามากกว่าหนึ่ง
David Underhill

ถ้าลำดับการแจงนับเป็นสิ่งสำคัญให้ผนวกORDER BY e.enumsortorderเข้ากับแบบสอบถาม ค่าแจกแจงส่วนใหญ่มีแนวโน้มที่จะออกคำสั่งถ้าค่าใหม่ที่ถูกใส่เข้าไปในประเภทการแจงนับโดยใช้หรือBEFORE AFTER
Clint Pachl

5
SELECT unnest(enum_range(NULL::your_enum))::text AS your_column

สิ่งนี้จะส่งคืนชุดผลลัพธ์คอลัมน์เดี่ยวของเนื้อหาของ enum "your_enum" พร้อมคอลัมน์ชื่อ "your_column" ของข้อความชนิด


4

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

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'))

1
คุณหมายความว่ามันเป็นประเภทอาเรย์? สิ่งนี้ใช้ได้สำหรับฉัน (PostgreSQL 9.0)
David Underhill

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