如何有效地将+1和一个包含数字部分的Varchar值相加



我有一个Varchar(9)列,它有一个识别特定案例的代码,它与主键ID不同,因为这个是在经过一些验证后创建的,而且代码没有按顺序创建,我们可以昨天在6创建一个案例,在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个字母,正如问题下面的注释中所指定的那样,您可以简单地使用子字符串函数,如下所示:

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')

如果您使用的是SQL Server 2017或更高版本,则可以使用TRIM来实现所需的结果。

尝试以下操作:

declare @tab table (ID int, val varchar(10))
insert into @tab select 1, 'AA0008-BX'
insert into @tab select 2, 'BA0010-BX'
insert into @tab select 3, 'XA0011-BX'
insert into @tab select 4, 'AY0009-BX'
select TOP 1 REPLACE(VAL, TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL)), TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL))+1 )
from @tab
ORDER BY TRY_CONVERT(INT, TRIM('ABCDEFGHIJKLMNOPQRSTUVWXYZ-' FROM VAL)) DESC

最新更新