用于生成字母数字字符串中的下一个序列的 SQL 代码

Man*_*aha 4 sql t-sql sql-server

我已经在 nvarchar 列中填充了一些字符串值。字符串的格式如下:

例如:16B、23G、128F、128M等...

我需要从中找出最大值,然后从代码生成下一个值。拾取最大物品的逻辑如下:

  1. 选取数字最大的字符串。
  2. 如果有多个最大的数字,则选取其中最大的字母串。

例如,上述系列中最大的字符串是128M。

现在我需要生成下一个序列。下一个字符串将有

  1. 与最大的数字相同,但字母增加 1。IE 128N
  2. 如果字母表到达Z,则数字加1,字母表为A。例如,128Z的下一个字符串是129A。

谁能告诉我什么样的 SQL 可以得到我想要的字符串。

Dam*_*ver 5

如果您可以更改表定义(*),则将基本值完全保留为数字并仅格式化为这些字符串会更容易:

create table T (
    CoreValue int not null,
    DisplayValue as CONVERT(varchar(10),(CoreValue / 26)+1) + CHAR(ASCII('A') + (CoreValue-1) % 26)
)
go
insert into T (CoreValue)
select ROW_NUMBER() OVER (ORDER BY so1.object_id)
from sys.objects so1,sys.objects so2
go
select * from T
Run Code Online (Sandbox Code Playgroud)

结果:

CoreValue   DisplayValue
----------- ------------
1           1A
2           1B
3           1C
4           1D
5           1E
6           1F
....
22          1V
23          1W
24          1X
25          1Y
26          2Z
27          2A
28          2B
29          2C
....
9593        369Y
9594        370Z
9595        370A
9596        370B
9597        370C
9598        370D
9599        370E
9600        370F
9601        370G
9602        370H
9603        370I
9604        370J
Run Code Online (Sandbox Code Playgroud)

因此插入新值就像从列中取出MAX并加 1 一样简单(假设可序列化隔离或类似的,以处理多个用户)


(*) 即使您无法更改表定义 - 我仍然会生成此表。然后,您可以将其连接到原始表,并使用它对列执行简单的操作MAXint然后添加一个并查找要使用的下一个字母数字值。只需填充您期望使用的尽可能多的值即可。