2016-06-13 40 views
3

我需要找出如何生成一個字母數字字符串,其格式類似於我當前使用的this question的答案,但必須採用以下格式:SQL - 生成具有特定格式的字母數字字符串

元音+輔音+元音+輔音+4位數字

例如ABAB1111或IJUZ9236。

感謝您的任何建議。

+0

您的問題仍然沒有得到clear.why你會想用ABAB產生一系列.......爲什麼不帶東西else.when它會改變? – KumarHarsh

回答

2

您可以按照此步驟:

生成vowelsA,E...)表,consonantsB,C..)表和numbers1,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()) 
     ); 
+0

嗨,感謝您的答案,我現在正在使用它,它用作查詢,但是當我嘗試將它用作存儲過程和標量值函數時,即使沒有出現紅線,也會引發語法錯誤。我在這裏有一個截圖:http://imgur.com/Y1FzZhD – Alycus

+1

@Alycus。 。 。在每個語句的末尾添加分號。 –

1

使用臨時表的數據。例如我會做這樣的;

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 

如果您正在運行多次,那麼創建包含您的元音,輔音和數字的適當表格是有意義的。這將減少此查詢的(確實很小的)成本。

1

這應該做的伎倆:

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 
0
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; 
相關問題