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 の問題には、最初の文字が関係しています。2 番目の文字がアルファベットの最後に到達するまで機能します。たとえば、カウントが26の場合、' az 'を期待しますが、代わりに ' bz ' を取得します。

SQL を小さくタイトに保ちたい (たとえば、CASE ステートメントを使用しない)。上記のコードが機能するように微調整することはできますか?

または、この猫の皮を剥ぐためのよりスマートな方法があれば、それを知りたい.

4

1 に答える 1

2

@RecordCount-1これは、 (範囲 0 から 675)の base-26 表現を計算するものと考えることができます。次に、base-26 数値の 2 桁を 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 に答える