Postgresql có enum hỗ trợ một thời gian trước đây.
CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);
Làm thế nào để tôi có được tất cả các giá trị được chỉ định trong enum với một truy vấn?
Postgresql có enum hỗ trợ một thời gian trước đây.
CREATE TYPE myenum AS ENUM (
'value1',
'value2',
);
Làm thế nào để tôi có được tất cả các giá trị được chỉ định trong enum với một truy vấn?
Câu trả lời:
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))
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ế myenum
bằ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.
NULL::
gì?
SELECT enum_range(myenum)
? Ý nghĩa của việc đúc là null
gì?
Thử:
SELECT e.enumlabel
FROM pg_enum e
JOIN pg_type t ON e.enumtypid = t.oid
WHERE t.typname = 'myenum'
ORDER BY e.enumsortorder
và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 BEFORE
hoặc AFTER
.
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.
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'))