【发布时间】:2020-10-14 06:43:23
【问题描述】:
我需要在 oracle 中创建一个字母数字序列,但无法弄清楚。已经查过已有的问题,但还没有完全看懂(我的sql知识不是那么好)。
数字 00001 将增加到 00009 然后新系列将从 00000A 开始并增加到 00000Z强>。
那么新系列将从0000A1开始,并增加到0000A9,在这个数字之后,新数字将以0000AA开头,并且上升到 0000AZ。
然后是数字 0000B1 上升到 0000B9 然后新系列从 0000BA 开始直到 0000BZ 等等开。
序列也应该有一个前缀,例如CNT00000Z, CNT0000A1
我尝试使用包装函数和不同的 oracle 转换函数(如 substr、mod、to_char 等)来测试不同的设置,但没有成功。
如果您有任何想法,我将不胜感激。
干杯, 亚历山大
【问题讨论】:
-
将数字序列转换为base 36 可以吗?但这与您所描述的不完全一样,因为
Z之后的数字将是10,而不是A1。 -
在这种情况下,最好写一个“插入前”触发器
-
还有另一种选择:如果客户端发送它,您可以有一个正常的数字序列并将 id render 作为 base36 和/或 parse 作为 base36作为实体键。这种转换在应用层中最容易执行,但在 SQL 中可能会发生,尽管很难看。
-
以 1 而不是 A 开头有多重要?在 oracle apex 中有一个名为 compress_int 的函数,可以将整数转换为类似的字符串。但它以 AAAB, AAAC, ... AAA1,AAA2,... 开头。您可以轻松地将前导“A”替换为“0”。该函数的代码可用。如果要求是基于整数生成唯一字符串,这将满足您的要求。如果要求生成一个字符串 exactly 像你的那么它不会。
-
@WilliamRobertson 恐怕我需要以 10 为底的序列(十进制)。