是否有可能创建一个间隔为枚举的类型?

时间:2015-03-07 07:46:36

标签: postgresql types enums

如何制作一个带有ENUM的新TYPE,它接受一个间隔的所有成员?像:

CREATE TYPE letters [a...z]

1 个答案:

答案 0 :(得分:0)

no built-in syntax for this,但您可以使用动态SQL执行此操作:

DO
$$
BEGIN
EXECUTE
   (
   SELECT 'CREATE TYPE a2z AS ENUM ('''
       || string_agg(chr(ascii('a') + g), ''',''')
       || ''')'
   FROM   generate_series(0,25) g
   );
END
$$;

这构建并执行以下形式的语句:

CREATE TYPE a2z AS ENUM ('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')

这取决于您的语言环境,但我认为所有语言环境在连续范围内都有a-z,这就是所需的全部内容。使用UTF-8语言环境进行测试。

替代任何不易融入ENUM

的内容

对于长值列表,往往会更改或不像示例或特殊数据类型那样简单的值。请考虑创建一个小的查找表,并使用{{ 3}}到它。选择日期的示例:

CREATE TABLE my_date (my_date date PRIMARY KEY);

INSERT INTO my_date(my_date) VALUES ('2015-02-03'), ...;

CREATE TABLE foo (
  foo_id serial PRIMARY KEY
, my_date date REFERENCES my_date ON UPDATE CASCADE
--,  more columns ...
);