Ingin cara yang masuk akal, efisien menyortir angka dalam string sebagai angka aktual? Pertimbangkan memilih untuk saran Microsoft Connect saya: Mendukung "penyortiran alami" / DIGITSASNUMBERS sebagai opsi Kolasi
Sementara Pertanyaan ini khusus untuk SQL Server, dan Jawaban ini tidak, saya merasa bahwa saya masih harus memposting informasi ini hanya untuk meningkatkan kesadaran akan hal itu dan tidak bertentangan dengan jawaban yang lain.
Yang sedang berkata, di luar SQL Server, di lingkungan tertentu adalah mungkin untuk melakukan penyortiran jenis ini. Ini adalah sesuatu yang setidaknya ditentukan dalam dokumentasi Unicode. Dalam BAHASA MARKUP DATA MARKUP DATA UNICODE (LDML) BAGIAN 5: standar / laporan COLLATION , ada bagan untuk Pengaturan Collation yang menjelaskan berbagai opsi untuk menyesuaikan perilaku penyortiran. Salah satu opsi adalah -kn-true
atau [numericOrdering on]
:
Jika disetel ke on , setiap urutan Digit Desimal (General_Category = Nd di [ UAX44 ]) diurutkan pada tingkat primer dengan nilai numeriknya. Misalnya, "A-21" <"A-123". Bobot primer yang dihitung semua pada awal kelompok penataan ulang digit . Jadi dengan tabel UCA yang tidak di-backup, "a $" <"a0" <"a2" <"a12" <"a⓪" <"aa".
Namun, dokumen ini adalah "standar teknis" dan bukan bagian dari spesifikasi inti Unicode. Catatan di bagian atas dokumen menyatakan:
Standar Teknis Unicode (UTS) adalah spesifikasi independen. Kesesuaian dengan Standar Unicode tidak menyiratkan kesesuaian dengan UTS.
Oleh karena itu, perilaku khusus ini tidak tersedia di SQL Server atau bahkan dalam. NET (setidaknya tidak secara native), meskipun keduanya sesuai dengan spesifikasi inti Unicode.
Proyek ICU (Komponen Internasional untuk Unicode) adalah seperangkat pustaka C / C ++ dan Java yang mengimplementasikan fungsi ini, dan bahkan ada demo online untuk itu. Dan di bawah "proyek terkait" ada tautan ke proyek .NET yang tampaknya menjadi pembungkus objek COM untuk pustaka ICU yang akan memungkinkan fungsi ini terpapar pada kode yang dikelola. Tetapi tidak jelas apakah proyek .NET itu masih aktif.
Tetapi untuk melihat perilaku ini dalam tindakan, buka Demo ICU Collation .
Rekatkan yang berikut ini ke area teks Input di sebelah kiri:
1
2
10B
6
11
10A
3
10
Tetapkan semua opsi ke "default". Periksa opsi "nomor baris masukan" di sebelah kanan sorttombol, dan pastikan bahwa opsi "kekuatan berbeda" tidak dicentang.
Klik sorttombol dan Anda harus mendapatkan kembali yang berikut:
[1] 1
[8] 10
[6] 10A
[3] 10B
[5] 11
[2] 2
[7] 3
[4] 6
Inilah yang harus diharapkan ketika melakukan pengurutan string yang khas, dan apa yang Anda lihat di SQL Server.
Sekarang, dalam serangkaian tombol radio tepat di atas sorttombol, baris kedua diberi label "numerik". Pilih tombol radio "on".
Klik sorttombol lagi dan Anda harus mendapatkan kembali yang berikut:
[1] 1
[2] 2
[7] 3
[4] 6
[8] 10
[6] 10A
[3] 10B
[5] 11
Mempertanyakan apakah ini berfungsi ketika bagian numerik berada di tengah-tengah string? Oke, rekatkan yang berikut ini ke area teks Input di sebelah kiri (ganti daftar sebelumnya):
Script - 1.sql
Script - 2.sql
Script - 10B.sql
Script - 6.sql
Script - 11.sql
Script - 10A.sql
Script - 3.sql
Script - 10.sql
Pastikan pengaturan numerik masih diatur ke "on". Klik sorttombol lagi dan Anda harus mendapatkan kembali yang berikut:
[1] Script - 1.sql
[2] Script - 2.sql
[7] Script - 3.sql
[4] Script - 6.sql
[8] Script - 10.sql
[6] Script - 10A.sql
[3] Script - 10B.sql
[5] Script - 11.sql
Ingin melihat ini di tempat lain? Buat folder di harddisk Anda, sesuatu seperti C: \ temp \ sorting \ , dan buat file kosong dengan nama "Script -..." yang sama. Lakukan DIR
di jendela perintah dan Anda akan melihat penyortiran standar. Tetapi ketika melihat daftar file di Windows Explorer Anda akan melihat daftar diurutkan menggunakan opsi "numerik" :-).