Min PostgreSQL sorterar som du vill. Sättet PostgreSQL jämför strängar på bestäms av lokalitet och sortering. När du skapar en databas med createdb
det finns -l
alternativet för att ställa in språk. Du kan också kontrollera hur den är konfigurerad i din miljö med 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 ser använder min databas polsk sortering.
Om du skapade en databas med hjälp av annan sortering kan du använda annan sortering i frågan precis som:
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 lista tillgängliga sorteringar genom att:
SELECT * FROM pg_collation;
REDIGERAD:
Åh, jag missade att 'a11' måste vara före 'a2'.
Jag tror inte att standardsortering kan lösa alfanumerisk sortering. För sådan sortering måste du dela upp strängen i delar precis som i Clodoaldo Neto-svar. Ett annat alternativ som är användbart om du ofta måste beställa på detta sätt är att dela upp namnfältet i två kolumner. Du kan skapa trigger på INSERT och UPPDATERA som delar upp name
till name_1
och name_2
och sedan:
SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;
(Jag ändrade sortering från polska till engelska, du bör använda din inhemska sortering för att sortera bokstäver som aącć etc.)