Percebi que, ao fazer o pedido, o PostgreSQL (atualmente estou trabalhando com 11, mas acho que o mesmo se aplica a 10 e 9) diferencia maiúsculas de minúsculas. Ele retorna uma string em maiúsculas antes de uma em minúscula. Por exemplo, digamos que eu tenha a friends
tabela com 3 registros e a first_name
coluna contenha respectivamente adam
, Tony
, Paul
.
SELECT name
FROM friends
ORDER BY name
retorna
[name]
Paul
Tony
adam
Para colocá-los em ordem alfabética, independentemente do caso, posso usar a lower
função.
SELECT name
FROM friends
ORDER BY lower(name)
retorna
[name]
adam
Paul
Tony
Agora preciso juntar a friends
tabela com a cities
tabela para obter apenas os amigos associados a uma cidade, mantendo os amigos em ordem alfabética e sem alterar o caso do nome .
A consulta a seguir é válida
SELECT DISTINCT lower(friends.name)
FROM friends
INNER JOIN cities
ON friends.city_id = cities.id
ORDER BY lower(friends.name)
Mas os nomes retornados são todos em minúsculas. No entanto, a consulta abaixo
SELECT DISTINCT friends.name
FROM friends
INNER JOIN cities
ON friends.city_id = cities.id
ORDER BY lower(friends.name)
retorna o erro
As expressões ORDER BY devem aparecer na lista de seleção.
Qual é a maneira mais simples de aplicar uma ordem que não diferencia maiúsculas de minúsculas, preservando as maiúsculas e minúsculas das strings retornadas?
A solução é simples: não use uma junção. Isso também elimina a necessidade de um DISTINCT.
Exemplo online: https://rextester.com/SNA62411
Você pode especificar uma cláusula COLLATE após ORDER BY, no entanto, parece que não há um modificador de agrupamento claro para diferenciar maiúsculas de minúsculas ou não - depende do sistema operacional e da codificação.
Acho que você pode classificar por lower/upper(col), mas talvez seja necessário observar problemas de desempenho se não tiver um índice de função nessa expressão. (Você precisaria adicionar
upper(friends.name), friends.name
à sua lista de seleção e ignorar a coluna de classificação)Existem alguns tópicos que tratam disso no SE, por exemplo: Por que meu PostgreSQL ORDER BY não diferencia maiúsculas de minúsculas?