在 SQL 服务器上生成序列代码 A-Z 然后 0-9

Generate Sequence Code A-Z then 0-9 on SQL Server

我有一个生成序列 ID 的案例,但先是字母然后是数字(A-Z 然后是 0-9)我看到了 在这里尝试解决方案,但解决方案总是先给我 0-9 然后 A-Z

    WITH seq AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY x.alpha + y.number + z.number ) AS Id,
        CONVERT(nchar(3), x.alpha + y.number + z.number) AS Result
    FROM 
        (
            VALUES 
            ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'),
            ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
            ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
            ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z')
        ) x(alpha) ,
        (
            VALUES 
            
            ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
            ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
            ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z'),
              ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')
        ) y(number),
        (
            VALUES 
           
            ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
            ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
            ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z'),  ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')
        ) z(number)
 
)


SELECT *  FROM seq WHERE Id = (SELECT Id + 1 FROM seq WHERE Result = 'A1Z')

应该生成的序列是:

AAA,...,AAZ,AA1,...,AA9,ABA,...,ABZ,AB1,..,AB9,...999

样本,当我点击 A1Z 时,预期的下一个值是 A11,但我尝试给我的解决方案是 A21,SQL 的行为是开始通过 0-9 然后 A-Z ,如何完成我的要求?

也许这就是你想要的?在 T-SQL 中,数字的价值低于字母,因此当您订购它们时,'9' 的数字低于 'A'。但是,您可以做的是检查该值是否是有效的 int 值,然后对不是第一个值的值进行排序,然后按字符排序。

这为您提供了以下内容:

WITH Characters AS(
    SELECT V.C
    FROM (VALUES('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'),
                ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
                ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
                ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z')) V(C)),
Sequences AS(
    SELECT CONCAT(C1.C,C2.C,C3.C) AS Sequence,
           ROW_NUMBER() OVER (ORDER BY TRY_CONVERT(int,C1.C), C1.C, TRY_CONVERT(int,C2.C), C2.C, TRY_CONVERT(int,C3.C), C3.C) AS RN
    FROM Characters C1
         CROSS JOIN Characters C2
         CROSS JOIN Characters C3)
SELECT *
FROM Sequences;

你没有说明 0 去哪里,所以我 假设 'AAZ','AA0', 'AA1'.. .

你可以尝试使用ASCII函数,在ORDER BY中用一个简单的算法,判断字符是数字还是字母。如果字符是数字需要添加 43

因为Z(大写字母)和0(第一个数字)之间的差距是43,我们需要将43加到数字字符中以确保数字总是在字母后面。

WITH seq AS
(
      
    SELECT 
        ROW_NUMBER() OVER (ORDER BY  IIF(x.alpha LIKE '[A-Z]', ASCII(x.alpha), ASCII(x.alpha) + 43),
                                     IIF(y.number LIKE '[A-Z]', ASCII(y.number), ASCII(y.number) + 43),
                                     IIF(z.number LIKE '[A-Z]', ASCII(z.number), ASCII(z.number) + 43)) AS Id,
        CONVERT(nchar(3), x.alpha + y.number + z.number) AS Result
    FROM 
        (
            VALUES 
            ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
            ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
            ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z'),
            ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')
           
        ) x(alpha) ,
        (
            VALUES 
            
            ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
            ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
            ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z'),
              ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')
        ) y(number),
        (
            VALUES 
           
            ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'), 
            ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'), 
            ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z'), 
            ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')
        ) z(number)
 
)



SELECT *  FROM seq WHERE Id = (SELECT Id + 1 FROM seq WHERE Result = 'A1Z');

sqlfiddle