Classificação de colunas alfanuméricas do Oracle

Aug 19 2020

Estou trabalhando para classificar a coluna de revisão de uma tabela de banco de dados Oracle na ordem ASC conforme abaixo. A princípio, as revisões numéricas a serem classificadas (1,2,3,…). Posteriormente Alfa-Numérico para ser classificado da seguinte forma: A, B, B1, C, C1, C2,…,Y, Y2, Y3, Z, AA, AB,..,DA, …ZZ, etc. Row_Number() em a instrução SELECT a ser preenchida com 1,2,3… para cada documento# (ABC, XYZ) após a classificação da revisão.

Veja a imagem carregada para a tabela necessária.

Eu tentei com SUBSTR , Order by, etc, mas não consegui resolver de acordo com o requisito acima. Alguém pode me ajudar com isso ? Obrigado!

Respostas

1 GMB Aug 19 2020 at 05:00

Pelo que entendi sua pergunta, você deseja colocar as últimas revisões que contenham apenas dois caracteres e nenhum dígito.

Você pode usar uma classificação condicional:

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

A expressão regular descreve uma string começando com um caractere alfanumérico, opcionalmente seguido por um dígito: essas revisões devem vir primeiro. Demonstração no 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
Nº DOC | REVISÃO | RN
:--- | :------- | -:
ABC | 1 | 1
ABC | 2 | 2
ABC | 3 | 3
ABC | A | 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

Existe um método antigo bem conhecido: rpad(col, max-length, '0')

Por exemplo rpad(col, max(length(col)) over(), '0'