定义范围的ASCII增量

时间:2012-06-27 04:15:19

标签: sql-server algorithm

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

范围从' 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语句)。我可以对上面的代码进行一些小调整,以便它可以工作吗?

或者,如果有一种更聪明的方法可以给这只猫上皮,我想知道。

1 个答案:

答案 0 :(得分:2)

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

SET @FirstLetter = CHAR(floor((@RecordCount-1) / @ALPHABET_LETTER_COUNT) + @START_ASCII)
SET @SecondLetter = CHAR(((@RecordCount-1) % @ALPHABET_LETTER_COUNT) + @START_ASCII)