Saya memiliki database dengan kolom VARCHAR yang berisi bilangan bulat dengan panjang yang bervariasi. Saya ingin mengurutkannya sehingga 10 muncul setelah 9, bukan 1, dan 70A muncul setelah 70. Saya bisa melakukan ini dengan PATINDEX () , CTE, dan pernyataan KASUS dalam klausa WHERE.
Namun, saya bertanya-tanya apakah ada susunan di mana ini tidak perlu.
sql-server
collation
sorting
natural-sort
Justin Dearing
sumber
sumber
Jawaban:
Tidak. Kolasi adalah tentang penyortiran alfabet, tergantung pada halaman kode, aksen, huruf besar-kecil, kana. Karakter angka (0-9) tidak memiliki properti di sana.
Jadi
9
selalu setelah10B
di setiap jenis.Anda harus membaginya seperti yang Anda perhatikan
atau urutkan seperti ini:Panjang di sebelah kanan menentukan berapa banyak ruang yang Anda miliki.Anda tentu saja dapat:
benar dibenarkan dalam char (versi tersimpan HAK saya di atas)2 saran terakhir seperti HAK saya di atas dan sedikit berbeda. Lebih cepat untuk menyortir (tidak diperlukan pemrosesan colukmn) tetapi lebih banyak penyimpanan diperlukan
sumber
9
selalu setelah10B
apapun. ": Itu hanya seperti itu di SQL Server karena opsi pengurutan yang mendasarinya untuk menangani "DigitsAsNumbers" belum diekspos sebagai opsi Collation. Namun ;-). Ini menjadi tersedia untuk aplikasi berbasis Windows dimulai pada Windows 7, terutama di File Explorer. Dan suatu hari dapat diekspos ke SQL Server, jika cukup banyak orang mendukung gagasan itu. Saya mencoba membuat bola bergulir dengan mengajukan saran Sambung berikut: Dukung "natural sorting" / DIGITSASNUMBERS sebagai opsi Collation .Saya akan menyiapkan kolom yang dihitung kemudian mengurutkan berdasarkan itu. Sesuatu seperti
Kemudian gunakan kolom ini untuk mengurutkan berdasarkan sekarang Anda dapat mengindeks kolom.
sumber
Jika Anda ingin cara yang menyakitkan untuk membuktikan apa yang dikatakan @gbn (pada dasarnya Anda tidak bisa memberi tahu susunan untuk memesan substring secara berbeda), Anda bisa membuat tabel #temp cepat yang memiliki koefisien untuk pesanan yang Anda harapkan, dan melihat apakah pemesanan dengan pemeriksaan apa pun mengembalikan pesanan yang sama:
Ini berjalan untuk saya dalam waktu sekitar 10 detik dan menghasilkan 0 baris - artinya tidak ada pemeriksaan yang tersedia untuk SQL Server (setidaknya 2008 R2, belum mencoba Denali) akan mengurutkan dengan cara yang Anda harapkan. Anda perlu cara berbeda untuk mendefinisikan penyortiran.
sumber
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]
:Namun, dokumen ini adalah "standar teknis" dan bukan bagian dari spesifikasi inti Unicode. Catatan di bagian atas dokumen menyatakan:
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:
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:
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:
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):
Pastikan pengaturan numerik masih diatur ke "on". Klik sorttombol lagi dan Anda harus mendapatkan kembali yang berikut:
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" :-).sumber