创建字母数字序列 Oracle SQL

Creating Alphanumeric Sequence Oracle SQL

提问人:Mephistofee 提问时间:10/13/2016 最后编辑:Mephistofee 更新时间:10/13/2016 访问量:2312

问:

我需要为我的主键创建一个包含 3 个字符和 4 个数字的字母数字序列。我试过在谷歌上搜索它,但没有遇到任何清晰或有用的东西。

那么,如何在 Oracle 中创建具有 3 个字符和 4 个数字的字母数字序列呢?

SQL 预言机

评论

2赞 10/13/2016
如果你指的是严格技术意义上的“序列”,你不能。Oracle 中的“序列”是指整数。同样奇怪的是,您想要系统生成的值,但您对格式有非常具体的要求。你为什么有这样的要求?你应该反击它。此外,您的要求将序列中的值限制为少量值(英文字母为 26^3 * 10000)。对于系统生成的 PK 来说,这也是一个非常不寻常的限制。
0赞 Alex Poole 10/13/2016
三个固定字符?如果不是,递增的模式是什么?例如,9999999 之后是 A000000,最终是 ZZZ9999?然后呢?另外,哪个字母表;和混合案例?
0赞 APC 10/14/2016
请更详细地解释您的要求。1 = , 2='AAA0002吗?还是别的什么?AAA0001, 1000 = 'AAB0000

答:

1赞 Matthew McPeak 10/13/2016 #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赞 Tyler Christian 7/6/2017
我认为作者正在寻找在调用时生成的单个序列。这会一次生成所有序列,我想这些序列可以被存储和引用。但是,可能存在一些阻塞问题,导致检索重复序列。
1赞 Marmite Bomber 10/13/2016 #2

@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赞 Tyler Christian 7/6/2017
请注意,它确实需要您设置一个序列以从 ( my_seq 开始)。如果它是一个可以调用的函数,这可能会更好。