Saya mencoba memesan berdasarkan kolom angka di database saya yang memiliki nilai 1-999
Saat saya menggunakan
ORDER_BY registration_no ASC
Saya mendapat….
1
101
102
103
104
105
106
107
108
109
11
110
Etc…
Jadi tampaknya memesan dengan digit pertama berlawanan dengan nomor tersebut.
Adakah yang tahu SQL apa yang digunakan jika saya ingin memesan ini berdasarkan nilai? Jadi 1,2,3,4,5,6
dll
sql
sql-order-by
Konnor 262
sumber
sumber
order by registration_no + 0 asc
untuk memecahkan masalah Anda.Jawaban:
Salah satu cara untuk mengurutkan berdasarkan bilangan bulat positif, ketika disimpan sebagai
varchar
, adalah mengurutkan berdasarkan panjangnya terlebih dahulu, kemudian nilainya:Ini sangat berguna ketika kolom mungkin berisi nilai non-numerik.
Catatan: di beberapa database, fungsi untuk mendapatkan panjang string mungkin dipanggil
length()
sebagai gantilen()
.sumber
order by
berpengaruh kecil terhadap kinerja.length()
sebagai penggantilen()
secara eksplisit mengonversi nilai menjadi angka. Kemungkinan lain untuk mencapai hal yang sama adalah
yang akan memaksa percakapan implisit.
Sebenarnya Anda harus memeriksa definisi tabel dan mengubahnya. Anda dapat mengubah tipe data menjadi
int
seperti iniALTER TABLE your_table MODIFY COLUMN registration_no int;
sumber
Jika Anda menggunakan SQL Server:
sumber
memberikan hasil yang diinginkan dengan peringatan.
Oleh karena itu, lebih baik untuk pergi
untuk hasil yang bersih tanpa peringatan SQL.
sumber
+ 0
pekerjaan? Saya telah mengujinya pada kumpulan data saya dan memang berhasil, tetapi saya penasaran mengapa? Apakah itu mengubahnya menjadi angka sebelum memesan?Saya berasumsi jenis kolom Anda adalah STRING (CHAR, VARCHAR, dll) dan prosedur penyortiran menyortirnya sebagai string. Yang perlu Anda lakukan adalah mengubah nilai menjadi nilai numerik. Bagaimana melakukannya tergantung pada sistem SQL yang Anda gunakan.
sumber
Terkadang Anda tidak punya pilihan untuk menyimpan nomor yang dicampur dengan teks. Di salah satu aplikasi kami, host situs web yang kami gunakan untuk situs e-niaga membuat filter dari daftar secara dinamis. Tidak ada opsi untuk mengurutkan berdasarkan bidang apa pun kecuali teks yang ditampilkan. Saat kami ingin filter dibuat dari daftar yang mengatakan hal-hal seperti 2 "hingga 8" 9 "hingga 12" 13 "hingga 15" dll, kami memerlukannya untuk mengurutkan 2-9-13, bukan 13-2-9 seperti yang akan terjadi saat membaca nilai numerik. Jadi saya menggunakan fungsi Replikasi SQL Server bersama dengan panjang nomor terpanjang untuk mengisi nomor yang lebih pendek dengan spasi di depan. Sekarang 20 diurutkan setelah 3, dan seterusnya.
Saya bekerja dengan tampilan yang memberi saya panjang minimum dan maksimum, lebar, dll. Untuk jenis dan kelas item, dan berikut adalah contoh cara saya membuat teks. (LB n Rendah dan LB n Tinggi adalah ujung Rendah dan Tinggi dari 5 kurung panjang.)
sumber
Saya lebih suka melakukan "PAD" untuk data. MySql menyebutnya LPAD, tetapi Anda dapat melakukan hal yang sama di SQL Server.
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
Rumus ini akan memberikan angka nol di depan berdasarkan panjang Kolom 3. Fungsi ini sangat berguna dalam situasi lain di luar ORDER BY, jadi itulah mengapa saya ingin memberikan opsi ini.
Hasil: 1 menjadi 001, dan 10 menjadi 010, sedangkan 100 tetap sama.
sumber
Masalah ini hanya karena Anda telah mendeklarasikan kolom dalam tipe data CHAR, VARCHAR atau TEXT. Ubah saja datatype ke INT, BIGINT dll. Ini akan menyelesaikan masalah pemesanan kustom Anda.
sumber