我有一个 PostgresORDER BY
下表的问题:
em_code name
EM001 AAA
EM999 BBB
EM1000 CCC
要将新记录插入表中,
- 我选择最后一条记录
SELECT * FROM employees ORDER BY em_code DESC
- 使用正则表达式从 em_code 中去除字母并存储在
ec_alpha
- 将重配部分转换为整数
ec_num
- 加一
ec_num++
- 填充足够的 zeors 和前缀
ec_alpha
again
When em_code
达到EM1000,上述算法失败。
第一步将返回 EM999 而不是 EM1000,它将再次生成 EM1000 作为新的em_code
,打破唯一键约束。
您知道如何选择 EM1000 吗?
从 Postgres 9.6 开始,可以指定一个排序规则来自然地对带有数字的列进行排序。
https://www.postgresql.org/docs/10/collation.html https://www.postgresql.org/docs/10/collation.html
-- First create a collation with numeric sorting
CREATE COLLATION numeric (provider = icu, locale = 'en@colNumeric=yes');
-- Alter table to use the collation
ALTER TABLE "employees" ALTER COLUMN "em_code" type TEXT COLLATE numeric;
现在只需像平常一样查询即可。
SELECT * FROM employees ORDER BY em_code
在我的数据上,我按以下顺序得到结果(请注意,它还会对外来数字进行排序):
Value |
0 |
0001 |
001 |
1 |
06 |
6 |
13 |
۱۳ |
14 |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)