Postgresql学习笔记之——数据类型之枚举类型

一、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)

你可能感兴趣的:(Postgresql)