【问题标题】:SQL - generate alphanumeric string with specific formatSQL - 生成具有特定格式的字母数字字符串
【发布时间】:2016-10-13 18:32:19
【问题描述】:

我需要了解如何生成一个字母数字字符串,其格式类似于我目前正在使用的this question 的答案,但它必须采用以下格式:

元音+辅音+元音+辅音+4位数字

例如 ABAB1111 或 IJUZ9236。

感谢您的任何建议。

【问题讨论】:

  • 你的问题还不清楚。为什么你会想用 ABAB 生成系列......为什么不用别的东西。什么时候会改变?

标签: sql sql-server random ascii


【解决方案1】:

您可以按照以下步骤操作:

生成vowels(A,E...) 表、consonants(B,C..) 表和numbers(1,2,..) 表。

然后使用这个查询:

SELECT  (SELECT TOP 1 * FROM vowels ORDER BY newid()) +
        (SELECT TOP 1 * FROM consonants ORDER BY newid()) +
        (SELECT TOP 1 * FROM vowels ORDER BY newid()) +
        (SELECT TOP 1 * FROM consonants ORDER BY newid()) +
        (SELECT TOP 1 * FROM numbers ORDER BY newid()) +
        (SELECT TOP 1 * FROM numbers ORDER BY newid()) +
        (SELECT TOP 1 * FROM numbers ORDER BY newid()) +
        (SELECT TOP 1 * FROM numbers ORDER BY newid()) 

【讨论】:

    【解决方案2】:

    我假设你想要一个随机字符串。这样的事情应该可以工作:

    with v as (
          select 'A' as c union all select 'E' union all . . . 
         ),
         c as (
          select 'B' as c union all select 'C' union all . . .
         ),
         d as (
          select '0' as c union all select '1' union all . . .
         )
    select ((select top 1 c from v order by newid()) +
            (select top 1 c from c order by newid()) +
            (select top 1 c from v order by newid()) +
            (select top 1 c from c order by newid()) +
            (select top 1 c from d order by newid()) +
            (select top 1 c from d order by newid()) +
            (select top 1 c from d order by newid()) +
            (select top 1 c from d order by newid())
           );
    

    【讨论】:

    • 嗨,谢谢你的回答,我现在正在使用它,它可以用作查询,但是当我尝试将它用作存储过程和标量值函数时,它甚至会引发语法错误虽然没有出现红线。我这里有截图:imgur.com/Y1FzZhD
    • @Alycus 。 . .在每条语句的末尾加上分号。
    【解决方案3】:

    使用临时表作为示例数据我会这样做;

    CREATE TABLE #Vowels (Vowel varchar(1))
    INSERT INTO #Vowels VALUES ('A'),('E'),('I'),('O'),('U')
    
    CREATE TABLE #Consonants (Consonant varchar(1))
    INSERT INTO #Consonants VALUES ('B'),('C'),('D'),('F'),('G'),('H'),('J'),('K'),('L'),('M'),('N'),('P'),('Q'),('R'),('S'),('T'),('V'),('W'),('X'),('Y'),('Z')
    
    CREATE TABLE #Numbers (Numbers varchar(1))
    INSERT INTO #Numbers VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)
    
    SELECT
    v1.Vowel + c1.Consonant + v2.Vowel + c2.Consonant + n1.Numbers + n2.Numbers + n3.Numbers + n4.Numbers AS Result
    
    FROM (SELECT TOP 1 Vowel FROM #Vowels ORDER BY NEWID()) v1
    CROSS JOIN (SELECT TOP 1 Consonant FROM #Consonants ORDER BY NEWID()) c1
    CROSS JOIN (SELECT TOP 1 Vowel FROM #Vowels ORDER BY NEWID()) v2
    CROSS JOIN (SELECT TOP 1 Consonant FROM #Consonants ORDER BY NEWID()) c2
    CROSS JOIN (SELECT TOP 1 Numbers FROM #Numbers ORDER BY NEWID()) n1
    CROSS JOIN (SELECT TOP 1 Numbers FROM #Numbers ORDER BY NEWID()) n2
    CROSS JOIN (SELECT TOP 1 Numbers FROM #Numbers ORDER BY NEWID()) n3
    CROSS JOIN (SELECT TOP 1 Numbers FROM #Numbers ORDER BY NEWID()) n4
    
    DROP TABLE #Consonants
    DROP TABLE #Numbers
    DROP TABLE #Vowels
    

    结果是这样出来的,但每次运行时都有不同的值。

    Result
    AQOF7641
    

    如果您多次运行此程序,则制作包含元音、辅音和数字的适当表格是有意义的。它将减少此查询的(诚然很小的)成本。

    【讨论】:

      【解决方案4】:

      这应该可以解决问题:

      WITH letters as
      (
        SELECT 'bcdfghjklmnpqrstvwxyz' c, 'aeiou' v
      )
      ,CTE as
      (
        SELECT
          SUBSTRING(v, CAST(rand()*5 as int)+1, 1)+
          SUBSTRING(c, CAST(rand()*21 as int)+1, 1)+
          SUBSTRING(v, CAST(rand()*5 as int)+1, 1)+
          SUBSTRING(c, CAST(rand()*21 as int)+1, 1)+
          right(10000+ CAST(rand()*10000 as int),4) x
        FROM letters
      )
      SELECT x
      FROM CTE
      

      【讨论】:

        【解决方案5】:
        DECLARE @AlphaString VARCHAR(200) = NULL;
        
        WITH
            CTE_Digits AS (
            SELECT TOP 255
                ROW_NUMBER() OVER (ORDER BY a.object_id) AS RowNum
            FROM
                sys.all_columns a
            CROSS JOIN
                sys.all_columns b),
            CTE_Types AS (
            SELECT
                CHAR(RowNum) AS Digit,
                CASE
                    WHEN RowNum < 58 THEN 'D'
                    WHEN CHAR(RowNum) IN ('A','E','I','O','U') THEN 'V'
                    ELSE 'C'
                END AS CharType
            FROM
                CTE_Digits
            WHERE
                RowNum BETWEEN 48 AND 57
                OR RowNum BETWEEN 65 AND 90),
            CTE_List AS (
            SELECT
                *,
                ROW_NUMBER() OVER (PARTITION BY CharType ORDER BY NEWID()) AS NewRow
            FROM
                CTE_Types),
            CTE_Ordered AS (
            SELECT
                *,
                CASE CharType
                    WHEN 'V' THEN 2
                    WHEN 'C' THEN 3
                    WHEN 'D' THEN 7
                END * NewRow AS DigitOrder
            FROM
                CTE_List
            WHERE
                (NewRow < 5
                AND CharType = 'D')
                OR NewRow < 3)
        SELECT @AlphaString = 
        (SELECT
            CAST(Digit AS VARCHAR(MAX))
        FROM
            CTE_Ordered
        ORDER BY
            DigitOrder
        FOR XML PATH(''));
        
        SELECT @AlphaString;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-21
          • 2021-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多