2009-12-01 32 views
7

tôi đã tạo ra một tùy chỉnh kiểu dữ liệu enum như vậy:Chuyển đổi một Integer để Enum trong PostgreSQL

create type "bnfunctionstype" as enum ( 
    'normal', 
    'library', 
    'import', 
    'thunk', 
    'adjustor_thunk' 
); 

Từ một nguồn dữ liệu bên ngoài tôi nhận được số nguyên trong khoảng [0,4]. Tôi muốn chuyển đổi các số nguyên này thành giá trị enum tương ứng của chúng.

Tôi làm cách nào để thực hiện việc này?

Tôi đang sử dụng PostgreSQL 8.4.

Trả lời

10
SELECT (ENUM_RANGE(NULL::bnfunctionstype))[s] 
FROM generate_series(1, 5) s 
+1

Điều này trông cực kỳ thanh lịch - Tôi sẽ thử nó vào thứ hai (khi tôi trở lại văn phòng) và tín dụng bạn cho một câu trả lời ... – BuschnicK

0
create function bnfunctionstype_from_number(int) 
    returns bnfunctionstype 
    immutable strict language sql as 
$$ 
    select case ? 
     when 0 then 'normal' 
     when 1 then 'library' 
     when 2 then 'import' 
     when 3 then 'thunk' 
     when 4 then 'adjustor_thunk' 
     else null 
    end 
$$; 
+0

Tôi cần phải làm điều này cho một số loại enum, vì vậy tôi thực sự muốn tránh lặp lại tất cả các giá trị riêng lẻ và tạo một thủ tục lưu trữ cho mỗi giá trị. – BuschnicK

2

Nếu bạn có một enum như thế này:

CREATE TYPE payment_status AS ENUM ('preview', 'pending', 'paid', 
            'reviewing', 'confirmed', 'cancelled'); 

Bạn có thể tạo một danh sách các mục có giá trị như thế này:

SELECT i, (enum_range(NULL::payment_status))[i] 
    FROM generate_series(1, array_length(enum_range(NULL::payment_status), 1)) i 

Mà cho:

i | enum_range 
---+------------ 
1 | preview 
2 | pending 
3 | paid 
4 | reviewing 
5 | confirmed 
6 | cancelled 
(6 rows) 
Các vấn đề liên quan