首页 > 解决方案 > 如何按 varchar 类型字段的年份分区

问题描述

我正在学习postgresql,我有一个源文件,有一个varchar类型的字段,它的值是这样的:

20190625
20190626
20190627
20190628
20190629
20190630

现在我想按该字段的第一个字符进行分区,也就是说,按年份分区,

我试着这样做:

partition by range(substr(str, 1,4));

但是这样不行,我想按年分区,比如1​​0年就10个分区,20年就20个分区,分区数不固定,怎么做?

标签: postgresql

解决方案


正如评论中提到的,date本来是一种更好的数据类型,但是由于日期至少采用“年-月-日”的形式,因此列上的简单范围分区应该这样做:

CREATE TABLE data (...)
PARTITION BY RANGE (str);

CREATE TABLE data_2019
PARTITION OF data FOR VALUES FROM ('20190101') TO ('20200101');

这是因为在这种格式中,日期顺序、数字顺序和字符串顺序是相同的。

确保添加COLLATE "C"到列定义以使字符串比较尽可能便宜。

我会添加一个检查约束来确定数据始终具有这种格式。


推荐阅读