PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Classificação alfanumérica sem distinção entre maiúsculas e minúsculas no postgres


Meu PostgreSQL classifica do jeito que você quiser. A maneira como o PostgreSQL compara strings é determinada pela localidade e pelo agrupamento. Quando você cria banco de dados usando createdb existe -l opção para definir localidade. Além disso, você pode verificar como ele está configurado em seu ambiente usando psql -l :
[[email protected]]$ psql -l
List of databases
 Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
---------+----------+----------+------------+------------+-----------------------
 mn_test | postgres | UTF8     | pl_PL.UTF8 | pl_PL.UTF8 |

Como você vê, meu banco de dados usa o agrupamento polonês.

Se você criou o banco de dados usando outro agrupamento, poderá usar outro agrupamento na consulta, como:
SELECT * FROM sort_test ORDER BY name COLLATE "C";
SELECT * FROM sort_test ORDER BY name COLLATE "default";
SELECT * FROM sort_test ORDER BY name COLLATE "pl_PL";

Você pode listar agrupamentos disponíveis por:
SELECT * FROM pg_collation;

EDITADO:

Oh, eu perdi que 'a11' deve estar antes de 'a2'.

Não acho que o agrupamento padrão possa resolver a classificação alfanumérica. Para tal ordenação você terá que dividir a string em partes como na resposta do Clodoaldo Neto. Outra opção útil se você precisar ordenar frequentemente dessa maneira é separar o campo de nome em duas colunas. Você pode criar um gatilho em INSERT e UPDATE que divide name em name_1 e name_2 e depois:
SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;

(Eu mudei o agrupamento do polonês para o inglês, você deve usar seu agrupamento nativo para classificar letras como aącć etc.)