Ошибка при получении максимального значения буквенно-цифровой последовательности в оракуле - PullRequest
1 голос
/ 06 июня 2019

У меня есть буквенно-цифровая последовательность от 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 Ответ

1 голос
/ 06 июня 2019

Вы должны сначала заказать свои данные, основываясь на первой проверке цифры, а затем получить макс.В 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 <<code>ABA00, которая имеет Положение 4.

...