0

客户希望根据计数附加一个带有文字增量的字段。

范围从“ aa ”到“ zz ”。

aa ”表示计数为1,“ zz ”表示范围内的最大值: 676

我有几乎可以工作的 sql,但希望能有专家帮助我克服最后一道障碍。

--Constants
DECLARE @START_ASCII INT = 97
DECLARE @ASCII_OFFSET INT = 1
DECLARE @ALPHABET_LETTER_COUNT INT = 26

--Variables
DECLARE @RecordCount INT = 0
DECLARE @FirstLetter VARCHAR(1) = NULL
DECLARE @SecondLetter VARCHAR(1) = NULL

SET @RecordCount = 1 --Range is 1 to 676 (e.g. 'aa' to 'zz')

SET @FirstLetter = CHAR(round(@RecordCount / @ALPHABET_LETTER_COUNT, 2, 1) + @START_ASCII) 
SET @SecondLetter = CHAR((((@RecordCount - @ASCII_OFFSET) % @ALPHABET_LETTER_COUNT) + @START_ASCII)) 

SELECT @FirstLetter + @SecondLetter

上面sql的问题涉及到第一个字母。它一直有效,直到第二个字母到达字母表的末尾。例如,计数为26时,我希望得到 ' az ',但得到的是 ' bz '。

我想保持 SQL 小而紧凑(例如没有 CASE 语句)。我可以对上面的代码进行一些小调整以使其正常工作吗?

或者,如果有更聪明的方法给这只猫剥皮,我想知道。

4

1 回答 1

2

我认为这是计算@RecordCount-1(范围 0 到 675)的 base-26 表示。然后将 base-26 数字的两位数映射到 ASCII 字符:

SET @FirstLetter = CHAR(floor((@RecordCount-1) / @ALPHABET_LETTER_COUNT) + @START_ASCII)
SET @SecondLetter = CHAR(((@RecordCount-1) % @ALPHABET_LETTER_COUNT) + @START_ASCII)
于 2012-06-27T04:30:35.780 回答