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

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

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;

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)              

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 #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.