Mijn PostgreSQL sorteert zoals u dat wilt. De manier waarop PostgreSQL tekenreeksen vergelijkt, wordt bepaald door de landinstelling en sortering. Wanneer u een database maakt met createdb
er is -l
optie om de landinstelling in te stellen. U kunt ook controleren hoe het in uw omgeving is geconfigureerd met 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 |
Zoals je ziet, gebruikt mijn database Poolse sortering.
Als u een database hebt gemaakt met een andere sortering, kunt u een andere sortering in de query gebruiken, net als:
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";
U kunt beschikbare sorteringen weergeven op:
SELECT * FROM pg_collation;
BEWERKT:
Oh, ik heb gemist dat 'a11' voor 'a2' moet staan.
Ik denk niet dat standaardsortering alfanumeriek sorteren kan oplossen. Voor een dergelijke sortering moet je string in delen splitsen, net als in Clodoaldo Neto-reactie. Een andere optie die handig is als u vaak op deze manier moet bestellen, is om het naamveld in twee kolommen te splitsen. U kunt een trigger maken op INSERT en UPDATE die name
splitsen in name_1
en name_2
en dan:
SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;
(Ik heb de sortering gewijzigd van het Pools in het Engels, u moet uw eigen sortering gebruiken om letters te sorteren, zoals aącć enz.)