Penyortiran kolom Oracle Alpha-Numeric

Aug 19 2020

Saya sedang mengerjakan Urutkan kolom Revisi dari tabel Oracle DB dalam urutan asc seperti di bawah ini. Mula-mula revisi numerik akan diurutkan (1,2,3,…). Kemudian Alpha-Numeric akan diurutkan sebagai berikut: A, B, B1, C, C1, C2,…, Y, Y2, Y3, Z, AA, AB, .., DA,… ZZ, dll Row_Number () di pernyataan SELECT diisi dengan 1,2,3… untuk setiap dokumen # (ABC, XYZ) setelah penyortiran revisi.

Lihat gambar yang diupload untuk tabel yang diperlukan.

Saya mencoba dengan SUBSTR, Order by, dll tetapi gagal memilah sesuai persyaratan di atas. Dapatkah seseorang membantu saya dalam hal ini ? Terima kasih!

Jawaban

1 GMB Aug 19 2020 at 05:00

Karena saya memahami pertanyaan Anda, Anda ingin meletakkan revisi terakhir yang hanya berisi dua karakter dan tanpa digit.

Anda dapat menggunakan pengurutan bersyarat:

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

Ekspresi reguler mendeskripsikan string yang dimulai dengan karakter alfanumerik, secara opsional diikuti dengan digit: revisi ini harus didahulukan. Demo di 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 | 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

Ada metode lama yang terkenal: rpad (col, max-length, '0')

Misalnya rpad (col, max (length (col)) over (), '0'