如何在SQL中向可变长度的生成编号指定位置插入字符
解决方案
你当前使用固定长度截取左右字符串的写法,只能适配固定长度的编号,当前缀数字段长度变化时就会出现错位,适配性很差。
核心实现逻辑:不需要硬编码截取长度,只要定位到编号中第一个/的位置,将字符串拆分为「斜杠前的内容」和「斜杠及之后的内容」两部分,把需要插入的字母拼接在两部分中间即可适配所有可变长度的符合格式的编号。
实现示例
从你现有SQL的语法特征判断大概率是PostgreSQL环境,可直接使用以下语句:
SELECT *, CONCAT( -- 截取第一个斜杠之前的所有内容 LEFT("NO_SURAT", POSITION('/' IN "NO_SURAT") - 1), -- 保留你原有生成插入字母的逻辑 CHR(64 + CAST ( row_number() OVER(PARTITION BY "ACCOUNT_NUMBER" order by "ACCOUNT_NUMBER") AS integer )), -- 截取第一个斜杠及之后的所有内容 SUBSTRING("NO_SURAT" FROM POSITION('/' IN "NO_SURAT")) ) AS No_suratpart from "account_information"
如果是MySQL环境,调整函数名即可:
SELECT *, CONCAT( LEFT(NO_SURAT, LOCATE('/', NO_SURAT) - 1), CHAR(64 + CAST ( row_number() OVER(PARTITION BY ACCOUNT_NUMBER order by ACCOUNT_NUMBER) AS UNSIGNED )), SUBSTRING(NO_SURAT, LOCATE('/', NO_SURAT)) ) AS No_suratpart from account_information
该写法不依赖编号前缀的长度,只要编号格式符合「要插入的位置在第一个斜杠之前」的规则,就可以正确插入字符,你给出的所有示例编号都可以正常得到预期结果。
内容的提问来源于stack exchange,提问作者Romli Eko
相关产品推荐
相关产品推荐

