Min PostgreSQL sorterer som du vil. Måden PostgreSQL sammenligner strenge på, bestemmes af lokalitet og sortering. Når du opretter database ved hjælp af createdb
der er -l
mulighed for at indstille lokalitet. Du kan også tjekke, hvordan det er konfigureret i dit miljø ved hjælp af 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 |
Som du kan se, bruger min database polsk sortering.
Hvis du har oprettet database ved hjælp af anden sortering, kan du bruge anden sortering i forespørgslen ligesom:
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";
Du kan liste tilgængelige sorteringer ved at:
SELECT * FROM pg_collation;
REDIGERET:
Åh, jeg savnede, at 'a11' skal være før 'a2'.
Jeg tror ikke, at standardsortering kan løse alfanumerisk sortering. For sådan sortering bliver du nødt til at opdele strengen i dele ligesom i Clodoaldo Neto-svaret. En anden mulighed, der er nyttig, hvis du ofte skal bestille på denne måde, er at adskille navnefeltet i to kolonner. Du kan oprette trigger på INSERT og UPDATE, der deler name
ind i name_1
og name_2
og derefter:
SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;
(Jeg ændrede sortering fra polsk til engelsk, du bør bruge din oprindelige sortering til at sortere bogstaver som aącć osv.)