SQL Diurutkan berdasarkan string, angka muncul terakhir

Saya memiliki pertanyaan yang mengembalikan kolom string yang ingin saya urutkan. Saat saya mengurutkan berdasarkan ASC/DESC, saya mendapatkan hasil yang sama. Berikut adalah contoh keluaran:

AVI
ksky site
Secure East
Shlomi
VSEStaging
1200165
120186
120186
120186
120032

Tapi saya ingin memiliki angka sebelum string alfabet. Misalnya untuk ASC:

1200165
120186
120186
120186
120032
AVI
ksky site
Secure East
Shlomi
VSEStaging

Misalnya untuk DESC:

VSEStaging
Shlomi
Secure East
ksky site
AVI
120032

Saat ini saya menggunakan REGEX seperti:

REGEXP_SUBSTR(UPPER(COLUMN_NAME), '^\D*') ,
TO_NUMBER(REGEXP_SUBSTR(UPPER(COLUMN_NAME), '\d+'))

Tolong bantu.


person David Faizulaev    schedule 20.02.2017    source sumber
comment
Lihat tautan ini jawaban terakhir   -  person Piotr Kamoda    schedule 20.02.2017
comment
Solusi yang diberikan baik untuk ASC tetapi untuk DESC.   -  person David Faizulaev    schedule 20.02.2017
comment
Apakah ini salah satu asumsi bahwa setiap string akan terdiri dari 100% digit (tidak ada karakter lain) atau 100% huruf (tidak ada karakter lain)? Jika hal tersebut tidak dijamin, maka Anda perlu memperjelas: Bagaimana seharusnya string 123abcd diurutkan? Bagaimana dengan #!- - di mana urutannya? Dll.   -  person mathguy    schedule 20.02.2017
comment
@DavidFaiz apakah Anda mencoba menambahkan desc dalam solusi di akhir klausa ORDER BY?   -  person Piotr Kamoda    schedule 20.02.2017


Jawaban (2)


Anda dapat menggunakan regexp_like(). Untuk pengurutan menaik:

order by (case when regexp_like(col, '^[0-9]+$') then 1 else 2 end) asc,
         col asc
person Gordon Linoff    schedule 20.02.2017
comment
@DavidFaiz - ini akan berfungsi untuk ASC dan DESC, cukup ubah kata terakhir dari asc menjadi desc (jangan sentuh baris kode pertama, hanya baris kedua). Ini mengasumsikan bahwa string Anda terdiri dari (1) 100% digit dan (2) yang lainnya. Lihat Komentar/Pertanyaan saya di bawah posting asli Anda (untuk klarifikasi). - person mathguy; 20.02.2017
comment
@DavidFaiz - apakah Anda mencoba mengubah asc menjadi desc? - person Alex Poole; 20.02.2017
comment
@AlexPoole - Saya anggap OP menginginkan angka di atas terlepas dari ASC atau DESC - jadi dia hanya boleh mengubah ASC kedua menjadi DESC. - person mathguy; 20.02.2017
comment
@mathguy - bukan itu yang ditampilkan di akhir pertanyaan. Itu memiliki string terlebih dahulu (desc; mungkin tidak peka huruf besar-kecil untuk menambah kesenangan) diikuti dengan angka (hanya satu yang ditampilkan, tidak yakin apakah harus asc atau desc, yang terakhir melihat asumsi yang masuk akal). - person Alex Poole; 20.02.2017

Anda dapat mencoba sesuatu yang berbeda seperti ini:

order by translate(upper(col), '1234567890', 'abcdefghij')
person user6585756    schedule 23.03.2017