在 oracle 中获取字母数字序列的最大值时出现问题
Posted
技术标签:
【中文标题】在 oracle 中获取字母数字序列的最大值时出现问题【英文标题】:Issue when getting max value of an alphanumeric sequence in oracle 【发布时间】:2019-06-06 09:01:55 【问题描述】:我有一个按以下方式创建的从 A0000 到 ZZZ99 的字母数字序列。
A0000 until Z9999. Then
AA000 until AZ999. Then
BA000 until ZZ999. Then
AAA00 until ZZZ99.
我想获取序列的 max() 值,但它与创建时的方式不同。
SELECT MAX(VAL) MAX_VAL FROM (select 'A0001' as val from dual union all
select 'A0087' as val from dual union all
select 'ABA00' as val from dual union all
select 'AAZ00' as val from dual union all
select 'B0032' as val from dual );
此示例查询返回 B0032,而我需要返回 ABA00。
也许将所有字符转换为 ASCII,然后取最大值将帮助我解决问题,但我不知道如何在查询中将每个字符动态更改为 ASCII。
任何帮助将不胜感激。谢谢
【问题讨论】:
在所有编码中,B 都在 A 之后,所以你的序列的最大值是 B0032 而不是 ABA00 ..所以如果你想要 ABA00 作为最大值,你应该更好地解释原因......可能是你正在寻找联合中的最后一个元素..但在 sql 中没有隐式顺序..如果您想要一个订单,您必须使用适当的值和 order by 【参考方案1】:您必须首先根据数字的第一个精度对数据进行排序,然后获得最大值。在ORACLE
你可以通过以下查询来做到这一点:
WITH dat AS (select 'A0001' as val from dual union all
select 'A0087' as val from dual union all
select 'ABA00' as val from dual union all
select 'AAZ00' as val from dual union all
select 'B0032' as val from dual)
SELECT MAX(val) KEEP (dense_rank last ORDER by REGEXP_INSTR(val, '\d')) FROM dat
原因是按字典顺序,每个以A
开头的单词都低于任何以B
开头的单词,但在您的情况下,第一个标准是第一个数字出现在哪个位置:
B0032
-> 位置 2,因此 B0032
ABA00 具有位置 4。
【讨论】:
以上是关于在 oracle 中获取字母数字序列的最大值时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
将 oracle 转换为 PostgreSQL 时出现数字溢出