我有一期Postgres ORDER BY,如下表所示:

em_code  name
EM001    AAA
EM999    BBB
EM1000   CCC

要向表中插入新记录,

  1. 我用SELECT * FROM employees ORDER BY em_code DESC Select 最后一条记录
  2. 使用reg exp从em_代码中剥离字母表,并存储在ec_alpha
  3. 将重拍部分转换为整数ec_num
  4. 增加ec_num++
  5. 用足够的Zeor和前缀ec_alpha再次填充

em_code达到EMem_code0时,上述算法失败.

第一步将返回EM999而不是EMem_code0,它将再次生成EMem_code0作为新的em_code,打破了唯一密钥约束.

知道如何 Select EM1000吗?

推荐答案

原因是字符串按字母顺序排序(而不是像您希望的那样按数字排序),在9之前按1排序.

SELECT * FROM employees
ORDER  BY substring(em_code, 3)::int DESC;

如果可以的话,从em_code中删除多余的"EM",并从一开始就保存一个整数,这样会更有效.

对 comments 中问题的回答

要从字符串中删除任何和所有非数字:

SELECT regexp_replace(em_code, E'\\D','','g')
FROM   employees;

\D is the regular expression class-shorthand for "non-digits".
'g' as 4th parameter is the "globally" switch to apply the replacement to every occurrence in the string, not just the first.

用空字符串替换每个非数字后,只剩下数字.

Postgresql相关问答推荐

Postgresql函数返回值别名

Postgis超过2个表的查询在运行时爆炸

处理Ruust-DIESEL中的Jsonb PostgreSQL列

使用PythonPolar在PostgreSQL中存储

GORM Golang SQL查询执行不区分大小写的搜索不起作用

如何在 sequelize 使用 db postgres 中通过外键更新记录和更新包含许多记录关系

转到 time.Time to postgresql timestamptz 无法用 time.Now() 保存

PostgreSQL 函数按名称传递参数

如何将 grafana 与 Google Cloud SQL 集成

使用间隔参数的 go postgres 准备好的语句不起作用

新数据未保存到 Postgres 上的 Rails 数组列

PostgreSQL unnest 与空数组

postgres 的密码

psql中set、\set和\pset的区别

冲突中的 Postgres 会更新复合主键

SELECT INTO 具有多个归因

gem install pg 无法绑定到 libpq

Postgis 中 2 点之间的距离,单位为 4326 米

ruby on rails jsonb 列默认值

在 pg_restore 期间排除表