Jak używać instrukcji SQL Order By sortować wyniki bez rozróżniania wielkości liter?

144

Mam bazę danych SQLite, którą próbuję posortować według kolejności alfabetycznej. Problem w tym, że SQLite nie bierze pod uwagę A = a podczas sortowania, więc otrzymuję takie wyniki:

A B C T a b c g

Chcę dostać:

A a b B C c g T

Jaką specjalną rzecz należy zrobić w języku SQL, o której nie wiem?

SELECT * FROM NOTES ORDER BY title
CodeFusionMobile
źródło
2
A jaki jest skuteczniejszy sposób na zrobienie tego? „ZAMÓWIENIE WEDŁUG TYTUŁU SORTUJ NOCASE” lub „ZAMÓWIENIE NA DOLNYM (TYTUŁ)”. (FYI, w moim przypadku na Androidzie, czyli SQLite)
Pascal

Odpowiedzi:

253

Ty też możesz to zrobić ORDER BY TITLE COLLATE NOCASE.

Edycja: jeśli chcesz określić ASClub DESC, dodaj to po NOCASEpolubieniu

ORDER BY TITLE COLLATE NOCASE ASC

lub

ORDER BY TITLE COLLATE NOCASE DESC
dan04
źródło
8
Czy „ORDER BY TITLE COLLATE NOCASE” jest bardziej wydajne niż „ORDER BY LOWER (TITLE)”?
Pascal
TO DO BANIA! prawda? Łał! dlaczego do cholery SQLite rozróżnia wielkość liter przy sortowaniu… nie pasuje mi to… niestety!
Vincy,
1
@ Vincy: Nie rozumiem, co jest takiego dziwnego w porównaniu ciągów uwzględniających wielkość liter. To jak <, ==itp operatorzy pracują domyślnie w każdym języku programowania, który ja znam.
dan04,
@ dan04 jak często potrzebujesz ciągu znaków, w którym wielkość liter ma znaczenie? dlatego jest to śmieszne. kto na świecie przejmuje się sprawami podczas sortowania ciągu? Jedyne miejsce, w którym widzę tę zaletę, to uwierzytelnianie lub weryfikacja hasła! Dlatego domyślnie musi być NIEWRAŻLIWA NA WIELKOŚĆ LITER, imo!
Vincy,
Zwykle nie zadziała to po wyjęciu z pudełka, jeśli baza danych używa UTF8. (Zauważ, że tytuł nie odnosi się tylko do SQLite.) W tym przypadku sugestia użycia lower () lub upper () poniżej jest tą, która działa.
marco
99

Możesz po prostu przekonwertować wszystko na małe litery w celu sortowania:

SELECT * FROM NOTES ORDER BY LOWER(title);

Jeśli chcesz mieć pewność, że wielkie litery nadal kończą się przed małymi, po prostu dodaj to jako drugie sortowanie:

SELECT * FROM NOTES ORDER BY LOWER(title), title;
Chad Birch
źródło
1
Sortuję według wielu kolumn, czy muszę umieszczać LOWER wokół każdej z nich?
CodeFusionMobile,
2
Tak, nie ma sposobu, aby zmienić zachowanie ORDER BY, aby nie rozróżniało wielkości liter.
Chad Birch
1
Czy jest jakaś różnica między „UPPER” a „LOWER”
Jagadeesh
2
W tym celu nie, oba osiągną ten sam efekt, czyli sprawią, że przypadek wszystkich przedmiotów będzie taki sam.
Ben Baron
1
Różnią się tylko znakami [] ^ _ `.
dan04
0
SELECT * FROM NOTES ORDER BY UPPER(title)              
Md Shahriar
źródło
14
Dziękuję za odpowiedź. Ale: Dobra odpowiedź zawsze będzie zawierała wyjaśnienie, co zostało zrobione i dlaczego zostało to zrobione w taki sposób, nie tylko dla PO, ale dla przyszłych gości SO.
B001 ᛦ