Порядок сортировки определяется объявлением типа:
create type my_enum as enum ('first', 'third');
with t(v) as (
values ('first'::my_enum), ('third')
)
select *
from t
order by 1;
v
-------
first
third
(2 rows)
Вы можете добавить новую метку в желаемую позицию:
alter type my_enum add value 'second' before 'third';
with t(v) as (
values ('first'::my_enum), ('third'), ('second')
)
select *
from t
order by 1;
v
--------
first
second
third
(3 rows)
Подробнее о CREATE TYPE
и ALTER TYPE
Если вышеприведенного недостаточно, используйте функцию карты, например:
create or replace function my_enum_map(my_enum)
returns int language sql as $$
select case $1
when 'first' then 100
when 'second' then 50
when 'third' then 75
end
$$;
with t(v) as (
values ('first'::my_enum), ('third'), ('second')
)
select *
from t
order by my_enum_map(v);
v
--------
second
third
first
(3 rows)
Вы также можете сохранить значения, используемыефункция в таблице для упрощения внесения изменений.