Tôi nghĩ bạn sẽ cần kiểm tra phiên bản PostgreSQL và thay đổi hành vi một cách thích hợp hoặc sử dụng SQL không chạm vào danh mục để xác định thứ tự.
Một ý tưởng cho phần sau, enum giả đưa ra:
CREATE TYPE test_enum AS ENUM ('z','x','y');
ALTER TYPE test_enum ADD VALUE 'a' BEFORE 'x';
là ORDER BY
ép kiểu của nhãn enum thành các giá trị của kiểu enum bằng cách sử dụng row_number
chức năng cửa sổ có sẵn trong phiên bản 8.4 và mới hơn:
SELECT enumlabel, row_number() OVER (ORDER BY enumlabel::test_enum) AS sort_key
FROM pg_catalog.pg_enum
WHERE enumtypid = 'test_enum'::regtype;
Điều này giúp bạn có các nhãn được sắp xếp theo một khóa sắp xếp. Trong các phiên bản Pg cũ hơn, Pg sẽ chỉ sắp xếp theo oid
của các giá trị enum, trong các phiên bản mới hơn, nó sẽ sử dụng trình sắp xếp, nhưng bạn không cần phải quan tâm theo cách nào cả, bạn vừa nói với PostgreSQL "vui lòng sắp xếp những thứ này theo đúng thứ tự".
Hoặc nếu bạn chỉ cần chúng theo thứ tự mà máy chủ mong đợi, hãy viết:
SELECT enumlabel
FROM pg_catalog.pg_enum
WHERE enumtypid = 'test_enum'::regtype
ORDER BY enumlabel::test_enum