PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Tri alphanumérique insensible à la casse dans postgres

Mon PostgreSQL trie comme vous le souhaitez. La façon dont PostgreSQL compare les chaînes est déterminée par les paramètres régionaux et le classement. Lorsque vous créez une base de données à l'aide de createdb il y a -l option pour définir les paramètres régionaux. Vous pouvez également vérifier comment il est configuré dans votre environnement en utilisant 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 |

Comme vous le voyez, ma base de données utilise la collation polonaise.

Si vous avez créé une base de données à l'aide d'un autre classement, vous pouvez utiliser un autre classement dans la requête comme :

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";

Vous pouvez répertorier les classements disponibles par :

SELECT * FROM pg_collation;

MODIFIÉ :

Oh, j'ai oublié que 'a11' doit être avant 'a2'.

Je ne pense pas que le classement standard puisse résoudre le tri alphanumérique. Pour un tel tri, vous devrez diviser la chaîne en parties comme dans la réponse de Clodoaldo Neto. Une autre option utile si vous devez fréquemment commander de cette manière consiste à séparer le champ de nom en deux colonnes. Vous pouvez créer un déclencheur sur INSERT et UPDATE qui divisent name dans name_1 et name_2 puis :

SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;

(J'ai changé le classement du polonais vers l'anglais, vous devez utiliser votre classement natif pour trier les lettres comme aącć, etc.)