¿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

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

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;

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)              

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 ᛦ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.