Comment utiliser l'instruction SQL Order By pour trier les résultats sans tenir compte de la casse?


144

J'ai une base de données SQLite que j'essaie de trier par ordre alphabétique. Le problème est que SQLite ne semble pas prendre en compte A = a pendant le tri, j'obtiens donc des résultats comme celui-ci:

A B C T a b c g

Je veux obtenir:

A a b B C c g T

Quelle chose SQL spéciale doit être faite que je ne sais pas?

SELECT * FROM NOTES ORDER BY title

2
Et quelle est la manière la plus efficace de le faire? "ORDER BY TITLE COLLATE NOCASE" ou "ORDER BY LOWER (TITLE)". (Pour info, dans mon cas, fonctionnant sous Android, c'est-à-dire SQLite)
Pascal

Réponses:


253

Vous pouvez également le faire ORDER BY TITLE COLLATE NOCASE.

Modifier: si vous devez spécifier ASCou DESC, ajoutez-le après NOCASEcomme

ORDER BY TITLE COLLATE NOCASE ASC

ou

ORDER BY TITLE COLLATE NOCASE DESC

8
"ORDER BY TITLE COLLATE NOCASE" est-il plus efficace que "ORDER BY LOWER (TITLE)"?
Pascal

CELA SUCE! n'est-ce pas? Hou la la! pourquoi diable SQLite le rend sensible à la casse pour le tri .... ne rentre pas dans mon esprit ... malheureusement!
Vincy

1
@Vincy: Je ne vois pas ce qui est si étrange dans la comparaison de chaînes sensibles à la casse. Voilà comment les <, ==etc. Les opérateurs travaillent par défaut dans toutes les langues de programmation que je connais.
dan04

@ dan04 à quelle fréquence avez-vous besoin d'une chaîne qui doit être sensible à la casse? c'est pourquoi c'est ridicule. qui dans le monde se soucie des cas lors du tri d'une chaîne? Le seul endroit où je vois l'avantage est l'authentification ou la validation du mot de passe! C'est pourquoi, par défaut, il doit être CASE INSENSITIVE, imo!
Vincy

Cela ne fonctionnera généralement pas directement si la base de données utilise UTF8. (Notez que le titre ne fait pas uniquement référence à SQLite.) Dans ce cas, la suggestion d'utiliser lower () ou upper () ci-dessous est celle qui fonctionne.
marco

99

Vous pouvez simplement tout convertir en minuscules à des fins de tri:

SELECT * FROM NOTES ORDER BY LOWER(title);

Si vous voulez vous assurer que les majuscules finissent toujours avant les minuscules, ajoutez simplement cela en tant que tri secondaire:

SELECT * FROM NOTES ORDER BY LOWER(title), title;

1
Je trie par plusieurs colonnes, dois-je mettre le PLUS BAS autour de chacune?
CodeFusionMobile

2
Oui, il n'y a aucun moyen de modifier le comportement de ORDER BY pour qu'il ne respecte pas la casse.
Chad Birch

1
Y a-t-il une différence entre 'UPPER' et 'LOWER'
Jagadeesh

2
À cette fin, non, ils auront tous les deux le même effet, qui est de rendre le cas de tous les articles le même.
Ben Baron

1
Ils ne diffèrent que pour les caractères [] ^ _ `.
dan04

0
SELECT * FROM NOTES ORDER BY UPPER(title)              

14
Merci pour votre réponse. Mais: Une bonne réponse aura toujours une explication de ce qui a été fait et pourquoi cela a été fait de cette manière, non seulement pour l'OP mais pour les futurs visiteurs de SO.
B001 ᛦ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.