2016-10-12 44 views
2

私の主キーに3文字と4数字の英数字シーケンスを作成する必要があります。私はそれを検索しようとしましたが、明確で有用なものは見つけられませんでした。英数字シーケンスの作成Oracle SQL

したがって、Oracleでは3文字と4数字で英数字シーケンスを作成するにはどうすればよいですか?

+2

あなたは、厳密な技術的な意味での「シーケンス」を意味する場合は、あなたがすることはできません。 Oracleの「シーケンス」は整数を意味します。システム生成の値が必要なのも奇妙ですが、フォーマットには非常に特殊な要件があります。なぜあなたはそのような要件を持っていますか?あなたはそれを元に戻すべきです。また、シーケンスの値を少数の値(英語アルファベット、26^3 * 10000)に制限します。これは、システム生成のPKに対する非常に珍しい制限です。 – mathguy

+0

固定文字は?もしそうでなければ、インクリメントするパターンは何でしょうか?例えば9999999のあとにA000000が続き、最終的にZZZ9999が続きますか?そして何?また、どのアルファベットも。と大文字小文字を混在 –

+0

要件をより詳細に説明してください。 1 = 'AAA0001'、2 = 'AAA0002'、1000 =' AAB0000'ですか?または、他の何か? – APC

答えて

1

このようなシーケンスには、すぐに使用できるサポートはありません。 Oracleの式を使用して、数値シーケンスを記述したものに変換することができます。たとえば、

select a || b || c || last_4 from (
SELECT ROWNUM rn, 
     lpad(MOD (ROWNUM, 10000),4,'0') last_4, 
     CHR (MOD (FLOOR (ROWNUM/10000), 26) + ASCII ('A')) c, 
     CHR (MOD (FLOOR (ROWNUM/(10000 * 26)), 26) + ASCII ('A')) b, 
     CHR (MOD (FLOOR (ROWNUM/(10000 * 26 * 26)), 26 * 26) + ASCII ('A')) a 
FROM DUAL 
CONNECT BY ROWNUM <= POWER (26, 3) * 10000 
) 
+0

著者は呼び出し時に生成される単一のシーケンスを探していたと思います。これは一度にすべてのシーケンスを生成します。これは保存して参照することができます。しかし、重複したシーケンスの検索につながるいくつかのブロッキング問題があるかもしれません。 –

1

@mathguyのコメントは非常に有効であり、要件を満たす必要があります。 数字をシーケンス文字列に変換する単純なマッピングを使用することができます。

このクエリはシーケンスを使用し、必要な形式に変換する:

select 
chr(ascii('A') + mod(FLOOR(FLOOR(FLOOR(my_seq.nextval/10000)/26)/26),26))|| 
chr(ascii('A') + mod(FLOOR(FLOOR(my_seq.nextval/10000)/26),26)) || 
chr(ascii('A') + mod(FLOOR(my_seq.nextval/10000),26)) || 
to_char(mod(my_seq.nextval,10000),'FM0009') seq 
from dual; 
+0

これを見ている人にとっては、(my_seq)から始まるようにシーケンスを設定する必要があります。そして、これは、呼び出すことができる関数であれば、おそらく良く機能します。 –

関連する問題