Bagaimana cara menggunakan SQL Order By statement untuk mengurutkan hasil yang tidak sensitif?

144

Saya memiliki database SQLite yang saya coba untuk mengurutkan berdasarkan urutan abjad. Masalahnya adalah, SQLite sepertinya tidak mempertimbangkan A = a selama penyortiran, jadi saya mendapatkan hasil seperti ini:

A B C T a b c g

Saya ingin mendapatkan:

A a b B C cg T

Apa hal SQL khusus yang perlu dilakukan yang tidak saya ketahui?

SELECT * FROM NOTES ORDER BY title
CodeFusionMobile
sumber
2
Dan apa cara yang lebih efisien untuk melakukannya? "ORDER BY TITLE COLLATE NOCASE" atau "ORDER BY LOWER (TITLE)". (FYI, dalam kasus saya, berjalan di Android, yaitu SQLite)
Pascal

Jawaban:

253

Anda juga bisa melakukannya ORDER BY TITLE COLLATE NOCASE.

Sunting: Jika Anda perlu menentukan ASCatau DESC, tambahkan ini setelah NOCASEsuka

ORDER BY TITLE COLLATE NOCASE ASC

atau

ORDER BY TITLE COLLATE NOCASE DESC
dan04
sumber
8
Apakah "ORDER BY TITLE COLLATE NOCASE" lebih efisien daripada "ORDER BY LOWER (TITLE)"?
Pascal
YANG TERSEMBUNYI! bukan? Wow! mengapa sih SQLite membuatnya case sensitif untuk menyortir .... tidak cocok dalam pikiran saya ... sayangnya!
Vincy
1
@Vincy: Saya tidak melihat apa yang aneh tentang perbandingan string case-sensitive. Yang ini bagaimana <, ==, dll operator bekerja secara default di setiap bahasa pemrograman yang aku kenal.
dan04
@ dan04 seberapa sering Anda membutuhkan string yang harus peka terhadap huruf besar-kecil? itu sebabnya itu konyol. siapa di dunia yang peduli kasus sambil menyortir string? Satu-satunya tempat yang saya lihat keunggulannya adalah untuk otentikasi atau validasi kata sandi! Itulah mengapa menjadi default harus KASUS TIDAK SENSOR, imo!
Vincy
Ini biasanya tidak akan berhasil, jika database menggunakan UTF8. (Perhatikan bahwa judul tidak merujuk hanya ke SQLite.) Dalam hal ini, saran untuk menggunakan lower () atau upper () di bawah adalah yang berfungsi.
marco
99

Anda bisa mengonversi semuanya menjadi huruf kecil untuk keperluan penyortiran:

SELECT * FROM NOTES ORDER BY LOWER(title);

Jika Anda ingin memastikan bahwa huruf besar masih berakhir di depan yang huruf kecil, tambahkan saja sebagai jenis sekunder:

SELECT * FROM NOTES ORDER BY LOWER(title), title;
Chad Birch
sumber
1
Saya menyortir dengan beberapa kolom, apakah saya harus meletakkan RENDAH di sekitar masing-masing?
CodeFusionMobile
2
Ya, tidak ada cara untuk mengubah perilaku ORDER BY menjadi peka huruf besar-kecil.
Chad Birch
1
Apakah ada perbedaan antara 'UPPER' dan 'LOWER'
Jagadeesh
2
Untuk tujuan ini, tidak mereka berdua akan mencapai efek yang sama, yaitu untuk membuat kasus semua item sama.
Ben Baron
1
Mereka berbeda hanya untuk karakter [] ^ _ `.
dan04
0
SELECT * FROM NOTES ORDER BY UPPER(title)              
Md Shahriar
sumber
14
Terima kasih atas jawaban anda. Tetapi: Jawaban yang baik akan selalu memiliki penjelasan tentang apa yang dilakukan dan mengapa itu dilakukan sedemikian rupa, tidak hanya untuk OP tetapi untuk pengunjung masa depan ke SO.
B001 ᛦ