Sắp xếp cột Oracle Alpha-Numeric
Tôi đang làm việc để Sắp xếp cột Bản sửa đổi của bảng Oracle DB theo thứ tự asc như bên dưới. Lúc đầu, các bản sửa đổi số được sắp xếp (1,2,3,…). Sau đó Alpha-Numeric sẽ được sắp xếp như sau: A, B, B1, C, C1, C2,…, Y, Y2, Y3, Z, AA, AB, .., DA,… ZZ, v.v. Row_Number () trong câu lệnh SELECT được điền 1,2,3… cho mỗi tài liệu # (ABC, XYZ) sau khi sắp xếp sửa đổi.
Xem hình ảnh đã tải lên để biết bảng yêu cầu.
Tôi đã thử với SUBSTR, Đặt hàng theo, v.v. nhưng không thể sắp xếp theo yêu cầu trên. Có ai có thể giúp tôi với cái này ? Cảm ơn!
Trả lời
Như tôi hiểu câu hỏi của bạn, bạn muốn đặt các bản sửa đổi cuối cùng chỉ chứa hai ký tự và không có chữ số.
Bạn có thể sử dụng sắp xếp có điều kiện:
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
Biểu thức chính quy mô tả một chuỗi bắt đầu bằng một ký tự chữ và số, theo sau là một chữ số tùy chọn: những bản sửa đổi này nên xuất hiện trước. Bản trình diễn trên 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 # | TÁI TẠ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 | số 8 ABC | D | 9 ABC | AA | 10 ABC | AB | 11 ABC | BA | 12 ABC | DA | 13
Có một phương pháp cũ nổi tiếng: rpad (col, max-length, '0')
Ví dụ: rpad (col, max (length (col)) over (), '0'