Алфавитно-цифровая сортировка столбцов Oracle

Aug 19 2020

Я работаю над сортировкой столбца Revision таблицы Oracle DB в порядке возрастания, как показано ниже. Сначала нужно отсортировать числовые ревизии (1,2,3,…). После этого алфавитно-цифровые символы будут отсортированы следующим образом: A, B, B1, C, C1, C2,…, Y, Y2, Y3, Z, AA, AB, .., DA,… ZZ и т. Д. Row_Number () в оператор SELECT должен быть заполнен 1,2,3… для каждого номера документа (ABC, XYZ) после сортировки ревизий.

См. Загруженное изображение для необходимой таблицы.

Я пробовал использовать SUBSTR, Order by и т. Д., Но не смог разобраться в соответствии с вышеуказанным требованием. Может ли кто-нибудь помочь мне в этом? Спасибо!

Ответы

1 GMB Aug 19 2020 at 05:00

Насколько я понимаю ваш вопрос, вы хотите поместить последние версии, содержащие только два символа и без цифр.

Вы можете использовать условную сортировку:

select 
    t.*, 
    row_number() over(
        partition by doc#
        order by 
            case when regexp_like(revision, '^\w\d?$') then 0 else 1 end,
            revision
    ) rn
from t
order by doc#, rn

Регулярное выражение описывает строку, начинающуюся с буквенно-цифрового символа, за которой может следовать цифра: эти версии должны быть первыми. Демо на DB Fiddle :

with t as (
    select 'ABC' doc#, '1' revision from dual
    union all select 'ABC', '2' from dual
    union all select 'ABC', '3' from dual
    union all select 'ABC', 'A' from dual
    union all select 'ABC', 'B' from dual
    union all select 'ABC', 'B1' from dual
    union all select 'ABC', 'C' from dual
    union all select 'ABC', 'C1' from dual
    union all select 'ABC', 'D' from dual
    union all select 'ABC', 'AA' from dual
    union all select 'ABC', 'AB' from dual
    union all select 'ABC', 'BA' from dual
    union all select 'ABC', 'DA' from dual
)
select 
    t.*, 
    row_number() over(
        partition by doc#
        order by 
            case when regexp_like(revision, '^\w\d?$') then 0 else 1 end,
            revision
    ) rn
from t
order by doc#, rn
ДОК № | ПЕРЕСМОТР | RN
: --- | : ------- | -:
ABC | 1 | 1
ABC | 2 | 2
ABC | 3 | 3
ABC | А | 4
ABC | B | 5
ABC | B1 | 6
ABC | C | 7
ABC | C1 | 8
ABC | D | 9
ABC | AA | 10
ABC | AB | 11
ABC | BA | 12
ABC | DA | 13
SayanMalakshinov Aug 19 2020 at 05:18

Хорошо известен старый метод: rpad (col, max-length, '0')

Например, rpad (col, max (length (col)) over (), '0'