Můj PostgreSQL třídí tak, jak chcete. Způsob, jakým PostgreSQL porovnává řetězce, je určen národním prostředím a řazením. Když vytvoříte databázi pomocí createdb
existuje -l
možnost nastavení národního prostředí. Také můžete zkontrolovat, jak je nakonfigurován ve vašem prostředí pomocí 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 |
Jak vidíte, moje databáze používá polské řazení.
Pokud jste vytvořili databázi pomocí jiného řazení, můžete v dotazu použít jiné řazení stejně jako:
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";
Dostupné porovnávání můžete vypsat podle:
SELECT * FROM pg_collation;
UPRAVENO:
Oh, přehlédl jsem, že 'a11' musí být před 'a2'.
Nemyslím si, že standardní řazení dokáže vyřešit alfanumerické řazení. Pro takové třídění budete muset rozdělit řetězec na části stejně jako v odpovědi Clodoaldo Neto. Další možností, která je užitečná, pokud často musíte objednávat tímto způsobem, je oddělit pole názvu do dvou sloupců. Můžete vytvořit spouštěč na INSERT a UPDATE, který rozdělí name
do name_1
a name_2
a poté:
SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;
(Změnil jsem řazení z polštiny na angličtinu, k řazení písmen jako aącć atd. byste měli použít své nativní řazení)