Skip to content

Mengurutkan field string berisi angka pada MySQL

5 April 2007

Barangkali Anda pernah menemukan kasus seperti yang saya alami 2 hari kemarin, ketika Anda mencoba melakukan sorting field string (char atau varchar) yang merupakan gabungan dari huruf dan angka, ternyata data yang didapat tidak sesuai harapan, yaitu data malah terurut bukan berdasarkan angkanya tapi sesuai dengan perlakuan mysql terhadap string secara keseluruhan.

Kita ambil contoh, ada sebuah field ID dengan struktur 1 digit berupa huruf dan 4 digit berupa angka.
ID = A1, A2, A5, A15, A18, B1500
Hasil sorting Ascending berdasarkan ID akan menjadi A1, A15, A18, A2, A5, B1500. Jika kita perhatikan hasilnya ternyata memang tidak berurut sesuai Angkanya seperti yang kita harapakan yaitu A1, A2, A5, A15, A18, B1500. Alhasil akhirnya hasil query secara keseluruhan urutannya ‘Acak Adut‘ jadinya.

So what to do guys to solve this prob ?

Agar data ID tadi terurut sesui angkanya, maka kita harus memisahkan antara huruf dan angka tsb, dan kita ambil angkanya sebanyak 4 digit dengan fungsi yang saya suka yaitu substring. Karakter pertama (abjad) tidak kita ambil, so start dari karakter ke dua. Selanjutnya kita beri nama-alias URUT supaya lebih mudah dibaca.

SELECT ID, SUBSTRING(ID,2,4) AS URUT FROM tablex ORDER BY URUT ASC

Masalah terpecahkan ? Belum. Setelah dirun hasilnya sama saja masih belum terurut sesuai angka meskipun ORDER BY sudah kita set ke alias dari angka tersebut.

Ugh, alias tersebut ternyata masih berupa string jadi mysql tidak mengubah apapun untuk membuatnya terurut sesuai angka, so kita harus beri perintah magic yang saya dapatkan ketika dulu mengulik database Firebird. It’s CAST function, yang berfungsi untuk meng-casting atau mengubah dari satu tipe data/value tertentu ke tipe data lainnya. Karena angka dari ID ini adalah dalam range integer, so kita casting menjadi Integer (SIGNED/UNSIGNED).

So Query diatas akan menjadi :

SELECT ID, CAST(SUBSTRING(ID,2,4) AS SIGNED) AS URUT FROM tablex ORDER BY URUT ASC

Cobalah run query diatas, the result should be as you expect it to be. Well, problem solved. But is there any other way ?

Masih dengan cara casting juga, namun tanpa perlu menggunakan fungsi CAST. Cukup kalikan saja dengan 1 atau tambahkan 0 (nol) maka otomatis MySQL akan mengcastingnya menjadi integer.

SELECT ID, SUBSTRING(ID,2,4) * 1 AS URUT FROM tablex ORDER BY URUT ASC

Di saat menulis artikel ini, saya coba-coba melakukan test casting untuk field yang mengandung leading zero (iseng-iseng aja), seperti A-0015, A-02 dan ternyata MySQL memang hebat. Dikalikan 1 ataupun menggunakan perintah CAST ternyata bisa mengembalikan nilai integer.

OK, sebagai penggelitik rasa kagum Anda pada MySQL, satu pertanyaan saja, jika huruf pada ID diatas tidak fix panjangnya misal AB01, BAC2345, AADF007 bagaimana Anda akan membaca angkanya. Apakah fungsi substring masih mumpuni atau harus menggunakan fungsi lain ?

Selamat ‘menikmati’, semoga bisa menambah kekaguman Anda pada MySQL🙂

7 Comments leave one →
  1. Anthon Rose permalink
    11 April 2007 1:09 pm

    gw mo msh tanya gmn? caranya mendowload script vbnet

  2. cevarief permalink
    14 April 2007 11:18 am

    Mas Anton,
    apa tuh maksudnya mendownload script vbnet..mungkin bisa dijelaskan agar lebih clear maksudnya ? shed some light yaa🙂

  3. andre permalink
    29 May 2007 4:55 pm

    thanks mas…tutorialnya..
    btw untuk menggabungkan string kan bisa make concat() mas..kok disitu contact?

  4. cevarief permalink
    4 June 2007 4:33 pm

    Oow…
    You’re totally rigth. Mistyped…harusnya CONCAT bukan CONTACT…ngetiknya kecepetan kali ya, jadi salah. Thanks for the correction🙂

  5. sandi utomo permalink
    8 December 2011 4:06 pm

    wah berguna sekali pak buat saya terima kasih.

  6. 25 May 2012 8:48 pm

    kalo pake vb6, perintah sql untuk kasus data yang berisi huruf dan angka seperti diatas bagaimana sintaksnya pak?? hatur nuhun

  7. 28 March 2013 11:39 pm

    Terima kasih sekali,,,
    sangat berguna bagi projek saya,,,
    Suksma

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: