sql - 如何有效地将 + 1 与具有数字部分的 Varchar 值相加?
问题描述
我有一Varchar(9)
列有一个代码来识别特定案例,它与主键 ID 不同,因为这个是在一些验证后创建的,而且代码不是按顺序创建的,我们可以在昨天 6 点创建一个案例,另一个一个在 8 点,另一个在 8 点将首先创建其代码,而不是另一个。好吧,问题是每个代码都应该是最后一个代码 + 1,这并不难,但是因为它包含非数字值,我们必须检索最大值,但这并不是很有效。
例如:
ID Code
1 AA0008-BX
2 AA0010-BX
3 AA0011-BX
4 AA0009-BX
所以在这种情况下,我必须遍历这 4 个值,检索 'AA0011-BX' 作为最大值,在数字部分添加 1 使其成为 'AA0012-BX',另外,我必须添加使其成为数字字符所需的零个数。因为它最后有 AA 和 -BX 部分,我们可以使用 max(Code) 并检索最大的,但这是一个包含数千条记录的表并且速度很慢,我想知道什么是最好的选择。
您将如何使用代码来解决这个问题以使其真正快速?TIA
解决方案
假设格式始终是 2 个字母、4 个数字、一个破折号,然后是 2 个字母,正如问题下的评论中所指定的那样,您可以像这样简单地使用substring函数:
declare @next int
select @next = max(cast(substring(code,3,4) as int))+1 from table1
insert into table1 values ('AA'+right('0000'+cast(@next as varchar(4)),4)+'-BX')
推荐阅读
- kotlin - 从泛型类型参数中删除可空性
- html - 与模块冲突 - 带类的 div 消失
- javascript - 在 ejs/express 中调用 setInterval() 并查询 db
- python - 使用 NSTask 在 Objective C 中运行 SH 脚本比从 Terminator 直接执行脚本慢
- android - 片段无法处理许多编辑文本
- php - 缺少路由资源显示所需的参数
- javascript - toISOString() 从值中减去天
- visual-studio - 在 Visual Studio 中编辑 RDL 文件
- vb.net - 如何在 vb.net 中的系列图表上获取 HitTest 的 XY 值
- python - SQLAlchemy TypeError: ('Params must be in a list, tuple, or Row', 'HY000')