¿Cómo usar la instrucción Ordenar por de SQL para ordenar los resultados sin distinción entre mayúsculas y minúsculas?

144

Tengo una base de datos SQLite que estoy tratando de ordenar por orden alfabético. El problema es que SQLite no parece considerar A = a durante la ordenación, por lo que obtengo resultados como este:

A B C T a b c g

Quiero tener:

A a b B C c g T

¿Qué cosa especial de SQL hay que hacer que no conozca?

SELECT * FROM NOTES ORDER BY title
CodeFusionMobile
fuente
2
¿Y cuál es la forma más eficiente de hacerlo? "ORDEN POR TÍTULO COLLATE NOCASE" o "ORDEN POR MENOR (TÍTULO)". (Para su información, en mi caso, se ejecuta en Android, es decir, SQLite)
Pascal

Respuestas:

253

También puedes hacer ORDER BY TITLE COLLATE NOCASE.

Editar: si necesita especificar ASCo DESC, agregue esto después de NOCASEcomo

ORDER BY TITLE COLLATE NOCASE ASC

o

ORDER BY TITLE COLLATE NOCASE DESC
dan04
fuente
8
¿"ORDER BY TITLE COLLATE NOCASE" es más eficiente que "ORDER BY LOWER (TITLE)"?
Pascal
Eso apesta! no es asi ¡Guauu! ¿Por qué diablos SQLite lo hace sensible a mayúsculas y minúsculas para la clasificación ... no cabe en mi mente ... por desgracia!
Vincy
1
@ Vincy: No veo qué tiene de extraño la comparación de cadenas que distingue entre mayúsculas y minúsculas. Así es como el <, ==, etc. operadores de trabajo por defecto en cualquier lenguaje de programación que estoy familiarizado.
dan04
@ dan04 ¿con qué frecuencia necesita una cadena que debe ser sensible a mayúsculas y minúsculas? Por eso es ridículo. ¿A quién en el mundo le importan los casos mientras ordena una cuerda? ¡El único lugar donde veo la ventaja es para la autenticación o validación de contraseña! Es por eso que por defecto tiene que ser CASO INSENSIBLE, ¡OMI!
Vincy
Esto generalmente no funcionará de inmediato, si la base de datos usa UTF8. (Tenga en cuenta que el título no se refiere solo a SQLite). En este caso, la sugerencia de usar lower () o upper () a continuación es la que funciona.
marco
99

Simplemente puede convertir todo a minúsculas con el fin de ordenar:

SELECT * FROM NOTES ORDER BY LOWER(title);

Si desea asegurarse de que las mayúsculas todavía terminan por delante de las minúsculas, simplemente agregue eso como una clasificación secundaria:

SELECT * FROM NOTES ORDER BY LOWER(title), title;
Abedul Chad
fuente
1
Estoy ordenando por múltiples columnas, ¿tengo que poner el INFERIOR alrededor de cada una?
CodeFusionMobile
2
Sí, no hay forma de cambiar el comportamiento de ORDER BY para que no distinga entre mayúsculas y minúsculas.
Chad Birch
1
¿Hay alguna diferencia entre 'SUPERIOR' y 'BAJO'
Jagadeesh
2
Para este propósito, no, ambos lograrán el mismo efecto, que es hacer que todos los elementos sean iguales.
Ben Baron
1
Solo difieren para los caracteres [] ^ _ `.
dan04
0
SELECT * FROM NOTES ORDER BY UPPER(title)              
MD Shahriar
fuente
14
Gracias por tu respuesta. Pero: una buena respuesta siempre tendrá una explicación de lo que se hizo y por qué se hizo de esa manera, no solo para el OP sino para los futuros visitantes de SO.
B001 ᛦ