PostgreSQL - 返回任何ENUM标签的函数

时间:2017-07-07 23:55:35

标签: postgresql enums postgresql-9.6

我正在尝试编写一个“泛型”函数,它将返回任何枚举的标签(在任何架构中)...... 但我没有太多运气,因为我不确定论证类型应该是什么......

目标是能够像这样调用函数

SELECT common.get_enum_labels('public.rainbow_colors');
SELECT common.get_enum_labels('audit.user_actions');

这就是我所拥有的

CREATE OR REPLACE FUNCTION common.get_enum_labels(enum_name regtype)
RETURNS SETOF text AS
$$
BEGIN
  EXECUTE format('SELECT unnest(enum_range(NULL::%s))::text AS enum_labels ORDER BY 1', enum_name);
END;
$$
LANGUAGE plpgsql
STABLE
PARALLEL SAFE
;

任何提示都将不胜感激

2 个答案:

答案 0 :(得分:2)

参数类型应为regtype,不要忘记从函数

返回一些内容
CREATE OR REPLACE FUNCTION get_enum_labels(enum_name regtype)
RETURNS SETOF text AS
$$
BEGIN
    RETURN QUERY
        EXECUTE format('SELECT unnest(enum_range(NULL::%s))::text ORDER BY 1', enum_name);
END;
$$
LANGUAGE plpgsql

答案 1 :(得分:1)

create or replace function get_enum_labels(enum_name regtype)
  returns setof text language sql stable 
as $$
  select enumlabel::text
  from pg_enum
  where enumtypid = enum_name
  order by enumsortorder
$$;