Clasificación de columnas alfanuméricas de Oracle

Aug 19 2020

Estoy trabajando para ordenar la columna de revisión de una tabla de Oracle DB en el orden asc como se muestra a continuación. Primero las revisiones numéricas a ordenar (1,2,3,…). A partir de ahí, Alfanumérico para ordenarse de la siguiente manera: A, B, B1, C, C1, C2,…,Y, Y2, Y3, Z, AA, AB,..,DA, …ZZ, etc. Row_Number() en la declaración SELECT se completará con 1,2,3... para cada documento # (ABC, XYZ) después de la clasificación de la revisión.

Vea la imagen cargada para la tabla requerida.

Intenté con SUBSTR , Ordenar por, etc., pero no pude resolver según el requisito anterior. Alguien me puede ayudar en esto ? ¡Gracias!

Respuestas

1 GMB Aug 19 2020 at 05:00

Según entiendo su pregunta, desea colocar las últimas revisiones que contienen solo dos caracteres y ningún dígito.

Puede utilizar una ordenación 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

La expresión regular describe una cadena que comienza con un carácter alfanumérico, seguido opcionalmente por un dígito: estas revisiones deben aparecer primero. Demostración en 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
DOC# | REVISIÓN | enfermero
:--- | :------- | -:
ABC | 1 | 1
ABC | 2 | 2
ABC | 3 | 3
ABC | un | 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 | AD | 13
SayanMalakshinov Aug 19 2020 at 05:18

Existe un método antiguo muy conocido: rpad(col, max-length, '0')

Por ejemplo rpad(col, max(longitud(col)) over(), '0'