Mój PostgreSQL sortuje tak, jak chcesz. Sposób, w jaki PostgreSQL porównuje ciągi znaków, zależy od ustawień regionalnych i sortowania. Kiedy tworzysz bazę danych za pomocą createdb
jest -l
możliwość ustawienia języka. Możesz również sprawdzić, jak jest skonfigurowany w twoim środowisku, używając 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 widzisz, moja baza danych używa sortowania po polsku.
Jeśli utworzyłeś bazę danych przy użyciu innego sortowania, możesz użyć innego sortowania w zapytaniu, tak jak:
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";
Możesz wyświetlić dostępne zestawienia według:
SELECT * FROM pg_collation;
EDYTOWANO:
Och, przegapiłem, że „a11” musi być przed „a2”.
Nie sądzę, że standardowe sortowanie może rozwiązać sortowanie alfanumeryczne. Do takiego sortowania będziesz musiał podzielić ciąg na części, tak jak w odpowiedzi Clodoaldo Neto. Inną opcją, która jest przydatna, jeśli często musisz zamawiać w ten sposób, jest rozdzielenie pola nazwy na dwie kolumny. Możesz utworzyć wyzwalacz podczas INSERT i UPDATE, który podzieli name
w name_1
i name_2
a następnie:
SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;
(Zmieniłem sortowanie z polskiego na angielski, powinieneś używać swojego rodzimego sortowania do sortowania liter, takich jak aącć itp.)