Truy vấn SQL để nhận tất cả các giá trị mà enum có thể có


Câu trả lời:


264

Nếu bạn muốn một mảng:

SELECT enum_range(NULL::myenum)

Nếu bạn muốn một bản ghi riêng cho từng mục trong enum:

SELECT unnest(enum_range(NULL::myenum))  

thông tin thêm

Giải pháp này hoạt động như mong đợi ngay cả khi enum của bạn không nằm trong lược đồ mặc định. Ví dụ, thay thế myenumbằng myschema.myenum.

Kiểu dữ liệu của các bản ghi được trả về trong truy vấn trên sẽ là myenum. Tùy thuộc vào những gì bạn đang làm, bạn có thể cần phải chuyển sang văn bản. ví dụ

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

Nếu bạn muốn chỉ định tên cột, bạn có thể chắp thêm AS my_col_name.


Tín dụng cho Justin Ohms để chỉ ra một số lời khuyên bổ sung, mà tôi kết hợp vào câu trả lời của mình.


1
Câu trả lời này ngắn gọn hơn nhiều. Đóng góp tốt đẹp!
Darin Peterson

3
Cuộc gọi không nhất định sẽ trả về các bản ghi loại myenum với tên cột là "myenum". Bạn cũng có thể muốn chuyển enum thành văn bản và chỉ định tên cột bằng cách thêm một cái gì đó như. :: văn bản NHƯ my_column
Justin Ohms

1
Để hiểu thêm về các hàm enum, bạn có thể xem liên kết này postgresql.org/docs/8.3/static/fifts-enum.html postgresql.org/docs/9.2/static/fiances-array.html
Bikal Basnet

1
ý nghĩa của nó là NULL::gì?
Sung Cho

1
@ChrisL cảm ơn. nó có vẻ rất lạ Tại sao chúng ta không thể làm gì SELECT enum_range(myenum)? Ý nghĩa của việc đúc là nullgì?
Sung Cho

31

Thử:

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

1
Nếu bạn có cùng enum trong nhiều hơn một lược đồ, điều này có thể cần được thu hẹp lại một chút. Nếu đó là trường hợp, hãy xem postgresql.org/docs/civerse/static/catalog-pg-type.html để biết chi tiết.
Kev

1
Tôi nghĩ rằng bạn cần phải thêm tiền tố 'myenum' với dấu gạch dưới. Kiểm tra câu trả lời của tôi nếu bạn cần lấy giá trị enum và tên enum có thể được sử dụng trong nhiều lược đồ.
David Underhill

Nếu thứ tự liệt kê là quan trọng, hãy thêm ORDER BY e.enumsortordervào truy vấn. Các giá trị được liệt kê rất có thể sẽ bị lỗi nếu các giá trị mới được chèn vào loại liệt kê sử dụng BEFOREhoặc AFTER.
Clint Pachl

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

Điều này sẽ trả về một tập kết quả cột duy nhất của nội dung của enum "your_enum" với một cột có tên "your_column" của văn bản loại.


4

Bạn có thể nhận được tất cả các giá trị enum cho một enum bằng truy vấn sau. Truy vấn cho phép bạn chọn không gian tên mà enum cũng sống (điều này là bắt buộc nếu enum được xác định trong nhiều không gian tên; nếu không bạn có thể bỏ qua phần truy vấn đó).

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
Bạn có ý nghĩa gì đó là kiểu mảng? Điều này làm việc cho tôi (PostgreSQL 9.0).
David Underhill

+1 Điều này hiệu quả với tôi trong khi câu trả lời của @ Kev thì không, do việc sử dụng các lược đồ trong DB của tôi.
dùng9645
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.