Como usar a instrução SQL Order By para classificar os resultados sem distinção entre maiúsculas e minúsculas?

144

Eu tenho um banco de dados SQLite que estou tentando classificar por ordem alfabética. O problema é que o SQLite parece não considerar A = a durante a classificação, portanto, obtenho resultados como este:

A B C T a b c g

Eu quero obter:

A a b B C c g T

Que coisa especial do SQL precisa ser feita que eu não conheço?

SELECT * FROM NOTES ORDER BY title
CodeFusionMobile
fonte
2
E qual é a maneira mais eficiente de fazer isso? "ENCOMENDAR POR TÍTULO COLOCAR NOCASE" ou "ENCOMENDAR POR BAIXO (TÍTULO)". (FYI, no meu caso, rodando em Android, ou seja, SQLite)
Pascal

Respostas:

253

Você também pode fazer ORDER BY TITLE COLLATE NOCASE.

Edit: Se você precisa especificar ASCou DESC, adicione depois NOCASEcomo

ORDER BY TITLE COLLATE NOCASE ASC

ou

ORDER BY TITLE COLLATE NOCASE DESC
dan04
fonte
8
"ORDER BY TITLE COLLATE NOCASE" é mais eficiente que "ORDER BY LOWER (TITLE)"?
Pascal
QUE SUGA! não é? Uau! por que diabos o SQLite está diferenciando maiúsculas de minúsculas para classificar .... não se encaixa na minha cabeça ... infelizmente!
Vincy
1
@Vincy: Não vejo o que há de tão estranho na comparação de strings com distinção entre maiúsculas e minúsculas. É assim que o <, ==, etc. operadores trabalham por padrão em cada linguagem de programação que eu estou familiarizado com.
dan04
@ dan04 com que frequência você precisa de uma string que diferencia maiúsculas de minúsculas? é por isso que é ridículo. quem no mundo se importa com os casos ao classificar uma string? O único lugar em que vejo a vantagem é na autenticação ou validação de senha! É por isso que, por padrão, tem que ser CASE INSENSITIVE, imo!
Vincy
Isso geralmente não funcionará imediatamente, se o banco de dados usar UTF8. (Observe que o título não se refere apenas ao SQLite.) Nesse caso, a sugestão de usar lower () ou upper () abaixo é a que funciona.
Marco
99

Você pode converter tudo para minúsculas para fins de classificação:

SELECT * FROM NOTES ORDER BY LOWER(title);

Se você deseja garantir que as maiúsculas ainda terminem à frente das minúsculas, basta adicionar isso como uma classificação secundária:

SELECT * FROM NOTES ORDER BY LOWER(title), title;
Chad Birch
fonte
1
Estou classificando por várias colunas, tenho que colocar o LOWER em torno de cada uma?
precisa saber é o seguinte
2
Sim, não há como alterar o comportamento de ORDER BY para não fazer distinção entre maiúsculas e minúsculas.
Chad Birch
1
Existe alguma diferença entre 'UPPER' e 'inferior'
Jagadeesh
2
Para esse propósito, não, ambos alcançarão o mesmo efeito, o que tornará o caso de todos os itens iguais.
Ben Baron
1
Eles diferem apenas para os caracteres [] ^ _ `.
dan04 27/05
0
SELECT * FROM NOTES ORDER BY UPPER(title)              
Md Shahriar
fonte
14
Obrigado pela sua resposta. Mas: Uma boa resposta sempre terá uma explicação do que foi feito e por que foi feito dessa maneira, não apenas para o OP, mas para futuros visitantes do SO.
B001 #