一、Postgresql数据库中的枚举类型不能直接使用,在使用前要先创建枚举类型,create type 命令创建枚举类型。
例如:
postgres=# create type week as enum('Sun','Mon','Tues','Wed','Thur','Fri','Sat');
CREATE TYPE
postgres=# create table tb_duty(person text, weekday week);
CREATE TABLE
postgres=# insert into tb_duty values('Zhang','Sun');
INSERT 0 1
postgres=# insert into tb_duty values('Li','Mon');
INSERT 0 1
postgres=# select * from tb_duty ;
person | weekday
--------+---------
Zhang | Sun
Li | Mon
(2 rows)
如果插入tb_duty表的weekday列中的值没有在枚举类型week中则会报错:
postgres=# insert into tb_duty values('Li','MON');
2020-02-26 09:25:32.727 CST [49927] ERROR: invalid input value for enum week: "MON" at character 33
2020-02-26 09:25:32.727 CST [49927] STATEMENT: insert into tb_duty values('Li','MON');
ERROR: invalid input value for enum week: "MON"
LINE 1: insert into tb_duty values('Li','MON');
注意:枚举类型中指定的值大小写敏感!!!匹配时值必须完全一致!!
如果想查询tb_duty表中枚举类型的定义,如下:
postgres=# \dT+ week
List of data types
Schema | Name | Internal name | Size | Elements | Owner | Access privileges | Description
--------+------+---------------+------+----------+----------+-------------------+-------------
public | week | week | 4 | Sun +| postgres | |
| | | | Mon +| | |
| | | | Tues +| | |
| | | | Wed +| | |
| | | | Thur +| | |
| | | | Fri +| | |
| | | | Sat | | |
(1 row)
直接查询系统表pg_enum也可以查看枚举类型的定义:
postgres=# select * from pg_enum;
oid | enumtypid | enumsortorder | enumlabel
-------+-----------+---------------+-----------
16416 | 16414 | 1 | Sun
16418 | 16414 | 2 | Mon
16420 | 16414 | 3 | Tues
16422 | 16414 | 4 | Wed
16424 | 16414 | 5 | Thur
16426 | 16414 | 6 | Fri
16428 | 16414 | 7 | Sat
二、枚举类型说明
在枚举类型中,定义的值的顺序是在创建此枚举类型week时已经定义好的顺序,而标准的运算符或者相关的聚集函数都可以对枚举类型就行操作。例如:
postgres=# select * from tb_duty ;
person | weekday
--------+---------
Zhang | Sun
Li | Mon
Feng | Tues
Qian | Wed
Sun | Thur
Wu | Fri
Wang | Sat
(7 rows)
postgres=# select min(weekday),max(weekday) from tb_duty ;
min | max
-----+-----
Sun | Sat
(1 row)
每个枚举类型都是独立存储的,一个枚举类型占4个字节。
三、枚举类型的函数
函数 | 描述 | 例子 | 结果 |
---|---|---|---|
enum_first(anyenum) | anyenum代表一个创建的枚举类型,函数返回此枚举类型的第一个值 | select enum_first(‘Mon’::week); | Sun |
enum_last(anyenul) | 返回枚举类型的最后一个值 | select enum_last(‘Mon’::week); | Sat |
enum_range(anyenum) | 以一个有序的数组形式返回输入枚举类型的所有值 | select enum_range(‘Mon’::week); | {Sun,Mon,Tues,Wed,Thur,Fri,Sat} |
enum_range(anyenum,anyenum) | 以一个有序数组返回在给定的两个枚举类型之间的范围,两个参数值必须时相同的枚举类型,如果第一个参数为null,其结果时从枚举类型的第一个值开始到给定的结束值,如果第二个参数为null,其结果将以枚举类型的给定的值开始到枚举类型的最后一个值结束(注意:给定的值也会包含在结果中 ) | 例1:select enum_range(‘Mon’::week , ‘Fri’::week); 例2:select enum_range(null , ‘Fri’::week); 例3:select enum_range(‘Mon’::week , null); | 例1:{Mon,Tues,Wed,Thur,Fri};例2:{Sun,Mon,Tues,Wed,Thur,Fri};例3:{Mon,Tues,Wed,Thur,Fri,Sat} |
表格中的函数enum_first、enum_last中,函数会忽略传入的参数值 Mon ,它只对声明的数据类型返回值,即使使用null也会得到相同的结果,例如:
postgres=# select enum_first(null::week),enum_first('Mon'::week),enum_last(null::week),enum_last('Mon'::week);
enum_first | enum_first | enum_last | enum_last
------------+------------+-----------+-----------
Sun | Sun | Sat | Sat
(1 row)