代码之家  ›  专栏  ›  技术社区  ›  Alex

postgresql:如何使用自定义emumortorder值定义枚举类型

  •  0
  • Alex  · 技术社区  · 7 年前

    是否有方法使用自定义顺序索引创建枚举类型。之后可以更新pg_type并将enumsortorder字段设置为所需的值,但问题是是否可以在创建期间执行此操作?比如说

    CREATE TYPE environment AS ENUM ('stage' 10, 'prod' 20);
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   klin    7 年前

    排序顺序由类型声明定义:

    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

    如果以上内容不够,请使用map函数,例如:

    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)
    

    您还可以将函数使用的值存储在表中,以便于修改。