下表有一个PostgresORDER BY
问题:
em_code name
EM001 AAA
EM999 BBB
EM1000 CCC
要在表中插入新记录,
我用
SELECT * FROM employees ORDER BY em_code DESC
选择最后一条记录使用reg exp从em_代码中提取字母并存储在
ec_alpha
将重新生成的部分转换为整数
ec_num
增加1
ec_num++
再次使用足够的zeor和前缀
ec_alpha
的Pad当
em_code
达到EM1000时,上述算法失败。第一步将返回EM999而不是EM1000,它将再次生成EM1000作为新的
em_code
,从而打破唯一键约束。知道如何选择EM1000吗?
最佳答案
原因是字符串按字母顺序排序(而不是像您希望的那样按数字排序),1在9之前排序。
你可以这样解决:
SELECT * FROM employees ORDER BY substring(em_code, 3)::int DESC
如果可以的话,从
em_code
中删除多余的“EM”,并保存一个整数作为开头,这样会更有效。对评论中问题的补充回答
要从字符串中删除任何和所有非数字:
SELECT regexp_replace(em_code, E'\\D','','g')
FROM employees
\D
是“非数字”的正则表达式class-shorthand。'g'
因为第四个参数是“全局”开关,用于将替换应用于字符串中的每个匹配项,而不仅仅是第一个匹配项。所以我用从字符串中提取数字的空字符串替换每个非数字。