暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

PostgreSQL征途:数据类型之枚举类型

0006.png

  • ​枚举(enum)类型是由一个静态、值的有序集合构成的数据类型。它们等效于很多编程语言所支持的enum类型。枚举类型的一个例子可以是一周中的日期,或者一个数据的状态值集合;
  • 枚举类型在PostgreSQL中属于自定义类型,包含一组静态且有序的值;
  • 枚举类型可以使用CREATE TYPE命令创建;

0000.gif

CREATE TYPE Week as ENUM('Sun','Mon','Tues','Wed','Thur','Fri','Sat');
复制
  • ​ 一旦被创建,枚举类型可以像很多其他类型一样在表和函数定义中使用;
CREATE TABLE demo_duty(person text, Weekday Week); INSERT INTO demo_duty values('Zhang','Sun'); INSERT INTO demo_duty values('Li','Mon'); INSERT INTO demo_duty values('Wang','Tues'); INSERT INTO demo_duty values('Chen','Wed'); INSERT INTO demo_duty values('Liu','Thur'); INSERT INTO demo_duty values('Sun','Fri'); INSERT INTO demo_duty values('Zhao','Sat'); SELECT * FROM demo_duty;
复制

pg0127.png

  • 如果插入 demo_duty 表的 Weekday 列中的值没有在枚举类型 Week 中则会报错;
INSERT INTO demo_duty values('Zhang','Thu'); ERROR: invalid input value for enum week: "Thu" LINE 1: INSERT INTO demo_duty values('Zhang','Thu');
复制
  • 枚举类型中指定的值大小写敏感,匹配时值必须完全一致,,例如 Mon 与 MON 是不同的值;
INSERT INTO demo_duty values('Zhang','MON'); ERROR: invalid input value for enum week: "MON" LINE 1: INSERT INTO demo_duty values('Zhang','MON');
复制

pg0128.png

  • 查询 demo_duty 表中枚举类型的定义;
\dT+ Week SELECT * FROM pg_enum;
复制

pg0129.png

  • 一个枚举类型的值的排序是该类型被创建时所列出的值的顺序,枚举类型支持所有比较操作符和MIN()、MAX()等聚合函数;
select * from demo_duty ; select min(weekday),max(weekday) from demo_duty;
复制

pg0130.png

SELECT * FROM demo_duty WHERE Weekday > 'Tues' ORDER BY Weekday; SELECT person FROM demo_duty WHERE Weekday = (SELECT MIN(Weekday) FROM demo_duty);
复制

pg0131.png

  • 每个枚举类型都是独立存储的,一个枚举类型占4个字节;

  • 枚举类型的函数

函数 描述
enum_first(anyenum) anyenum代表一个创建的枚举类型,函数返回此枚举类型的第一个值
enum_last(anyenul) 返回枚举类型的最后一个值
enum_range(anyenum) 以一个有序的数组形式返回输入枚举类型的所有值
enum_range(anyenum,anyenum) 以一个有序数组返回在给定的两个枚举类型之间的范围,两个参数值必须时相同的枚举类型,如果第一个参数为null,其结果时从枚举类型的第一个值开始到给定的结束值,如果第二个参数为null,其结果将以枚举类型的给定的值开始到枚举类型的最后一个值结束(注意:给定的值也会包含在结果中 )
select enum_first(null::week),enum_first('Mon'::week),enum_last(null::week),enum_last('Mon'::week);
复制

pg0132.png

select enum_range('Mon'::week); select enum_range('Mon'::week,'Fri'::week); select enum_range(null,'Fri'::week); select enum_range('Mon'::week,null);
复制

pg0133.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论