Saya memiliki nomor yang disimpan sebagai VARCHAR
database MySQL. Saya tidak dapat membuatnya INT
karena beberapa keadaan tergantung lainnya.
Ini menganggap mereka sebagai karakter bukan sebagai angka saat menyortir.
Dalam database yang saya miliki
1 2 3 4 5 6 7 8 9 10...
Di halaman saya itu menunjukkan daftar yang dipesan seperti ini:
1 10 2 3 4 5 6 7 8 9
Bagaimana cara membuatnya tampak diurutkan berdasarkan angka yang naik?
Jawaban:
Jika memungkinkan Anda harus mengubah tipe data kolom menjadi angka jika Anda hanya menyimpan angka saja.
Jika Anda tidak dapat melakukannya, ubah nilai kolom Anda menjadi
integer
secara eksplisit denganselect col from yourtable order by cast(col as unsigned)
atau secara implisit misalnya dengan operasi matematika yang memaksa konversi menjadi angka
select col from yourtable order by col + 0
BTW MySQL mengubah string dari kiri ke kanan. Contoh:
string value | integer value after conversion --------------+-------------------------------- '1' | 1 'ABC' | 0 /* the string does not contain a number, so the result is 0 */ '123miles' | 123 '$123' | 0 /* the left side of the string does not start with a number */
sumber
1
decimal
.Cara lain, tanpa menggunakan satupun cast.
(Untuk orang yang menggunakan JPA 2.0, di mana casting tidak diperbolehkan)
select col from yourtable order by length(col),col
EDIT: hanya berfungsi untuk bilangan bulat positif
sumber
Cara lain dan sederhana
ORDER BY ABS(column_name)
sumber
Kolom yang saya sortir memiliki kombinasi alfa dan numerik, jadi saya menggunakan saran dalam posting ini sebagai titik awal dan menghasilkan ini.
DECLARE @tmp TABLE (ID VARCHAR(50)); INSERT INTO @tmp VALUES ('XYZ300'); INSERT INTO @tmp VALUES ('XYZ1002'); INSERT INTO @tmp VALUES ('106'); INSERT INTO @tmp VALUES ('206'); INSERT INTO @tmp VALUES ('1002'); INSERT INTO @tmp VALUES ('J206'); INSERT INTO @tmp VALUES ('J1002'); SELECT ID, (CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END) IsNum FROM @tmp ORDER BY IsNum, LEN(ID), ID;
Hasil
ID ------------------------ 106 206 1002 J206 J1002 XYZ300 XYZ1002
Semoga ini membantu
sumber
1 - ISNUMERIC(ID)
alih-alih(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)
mengubah 0 ke 1 dan sebaliknya.Ini berhasil untuk saya.
select * from tablename order by cast(columnname as int) asc
sumber
Cara lain untuk mengonversi.
Jika Anda memiliki bidang string, Anda dapat mengubahnya atau bagian numeriknya dengan cara berikut: tambahkan nol di depan agar semua string bilangan bulat memiliki panjang yang sama.
atau urutkan berdasarkan bagian bidang seperti 'tensymbols13', 'tensymbols1222', dll.
sumber
Ini akan menangani angka negatif, pecahan, string, semuanya:
sumber
Saya juga mencari bidang penyortiran yang memiliki awalan huruf. Inilah yang saya temukan solusinya. Ini mungkin membantu yang mencari solusi yang sama.
Nilai Bidang:
FL01,FL02,FL03,FL04,FL05,...FL100,...FL123456789 select SUBSTRING(field,3,9) as field from table order by SUBSTRING(field,3,10)*1 desc
SUBSTRING(field,3,9)
saya meletakkan 9 karena 9 adalah cara yang cukup bagi saya untuk menahan nilai integer maksimal 9 digit.Sehingga hasilnya akan menjadi 123456789 123456788 123456787 ... 100 99 ... 2 1
sumber
Mungkin membantu siapa yang mencari solusi yang sama.
select * from tablename ORDER BY ABS(column_name)
sumber
Jika Anda menggunakan AdonisJS dan memiliki ID campuran seperti ABC-202, ABC-201 ..., Anda dapat menggabungkan kueri mentah dengan Query Builder dan menerapkan solusi di atas ( https://stackoverflow.com/a/25061144/4040835 ) sebagai berikut:
CATATAN: Dalam baris ini:
SUBSTRING(:sortField:,3,15)*1 ${sortDirection}
,Referensi 1: Anda dapat membaca lebih lanjut tentang pengikatan parameter dalam kueri mentah di sini: https://knexjs.org/#Raw-Bindings Ref 2: Kueri Mentah Adonis: https://adonisjs.com/docs/4.1/query-builder# _raw_queries
sumber
Ubah bidang Anda menjadi INT, bukan VARCHAR.
Kemudian perbaiki dulu keadaan tergantung. Jika tidak, Anda sedang mengatasi masalah mendasar yang sebenarnya. Menggunakan MySQL CAST adalah sebuah opsi, tetapi itu menutupi skema buruk Anda yang harus diperbaiki.
sumber