在oracle中获取字母数字序列的最大值时出现的问题

时间:2019-06-06 09:01:55

标签: sql oracle oracle11g oracle10g

我有一个按以下方式创建的从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。

任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分: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。