การเรียงลำดับคอลัมน์ Oracle Alpha-Numeric

Aug 19 2020

ฉันกำลังดำเนินการจัดเรียงคอลัมน์การแก้ไขของตาราง Oracle DB ตามลำดับ asc ตามด้านล่าง ในตอนแรกการแก้ไขตัวเลขจะถูกจัดเรียง (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, สั่งซื้อโดย ฯลฯ แต่ล้มเหลวในการจัดเรียงตามข้อกำหนดข้างต้น มีใครช่วยฉันได้ไหม ขอบคุณ!

คำตอบ

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
DOC # | การแก้ไข | 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

มีวิธีการเก่าที่รู้จักกันดีคือ rpad (col, max-length, '0')

ตัวอย่างเช่น rpad (col, max (length (col)) over (), '0'