2012-06-27 70 views
0

客戶端希望根據計數附加一個字段並增加文字增量。帶有定義範圍的ASCII增量

範圍從'aa'變爲'zz'。

'AA' 代表和 'ZZ' 計數表示範圍內的最大值:

我的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的問題涉及到第一個字母。它的作品一直到第二個字母到達字母表末尾。例如,在計數爲,我預計'az',而是得到'bz'。

我想保持SQL小而緊(例如沒有CASE語句)。是否可以對上述代碼進行小小的調整,以便它可以正常工作?或者,如果只有一種更聰明的方式來撫摸這隻貓,我想知道這一點。

回答

2

我認爲這是計算@RecordCount-1(範圍0到675)的基數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)