„Normalizuj” do sortowania
możesz użyj regexp_replace()
ze wzorcem '[^a-zA-Z]'
w ORDER BY
klauzula, ale rozpoznaje tylko czyste litery ASCII. Lepiej użyj skrótu klasy '\W'
który rozpoznaje dodatkowe litery spoza ASCII w Twoim języku, takie jak äüóèß
itp. Lub możesz improwizować i "normalizować wszystkie znaki z elementami diakrytycznymi do ich formy bazowej za pomocą unaccent()
funkcjonować. Rozważ to małe demo:
SELECT *
, regexp_replace(x, '[^a-zA-Z]', '', 'g')
, regexp_replace(x, '\W', '', 'g')
, regexp_replace(unaccent(x), '\W', '', 'g')
FROM (
SELECT 'XY ÖÜÄöüäĆČćč€ĞğīїıŁłŃńŇňŐőōŘřŠšŞşůŽžż‘´’„“”–—[](),;.:̈� XY'::text AS x) t
->SQLfiddle dla Postgresa 9.2.
->SQLfiddle dla Postgres 9.1.
Kod wyrażeń regularnych został zaktualizowany w wersji 9.2. zakładam jest to powód ulepszonej obsługi w wersji 9.2, w której wszystkie znaki literowe w przykładzie są dopasowywane, podczas gdy w wersji 9.1 dopasowuje się tylko niektóre.
unaccent()
jest dostarczany przez dodatkowy moduł unaccent
. Uruchom:
CREATE EXTENSION unaccent;
raz na bazę danych do użycia w (Postgres 9.1+, starsze wersje używają inna technika ).
lokalizacje / zestawienie
Musisz mieć świadomość, że Postgres opiera się na podstawowym systemie operacyjnym dla ustawień regionalnych (w tym sortowania). Porządek sortowania zależy od wybranej lokalizacji lub bardziej szczegółowej LC_COLLATE
. Więcej w tej powiązanej odpowiedzi:
Porządek sortowania ciągów (LC_COLLATE i LC_CTYPE)
Istnieją plany bezpośredniego włączenia obsługi sortowania do Postgresa , ale obecnie nie jest to dostępne.
Wiele ustawień regionalnych ignoruje znaki specjalne, które opisujesz do sortowania danych znakowych po wyjęciu z pudełka. Jeśli masz zainstalowaną lokalizację w swoim systemie, która zapewnia porządek sortowania, którego szukasz, możesz użyć jej ad-hoc w Postgresie 9.1 lub nowszym:
SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"
Aby zobaczyć, które sortowania są zainstalowane i dostępne w bieżącej instalacji Postgresa:
SELECT * FROM pg_collation;
Niestety nie jest możliwe zdefiniowanie własnego niestandardowego sortowania (jeszcze), chyba że zhakujesz kod źródłowy.
Reguły sortowania są zwykle regulowane przez reguły języka używanego w danym kraju. Porządek sortowania książek telefonicznych byłby w porządku, gdyby nadal istniały książki telefoniczne ... Twój system operacyjny je zapewnia.
Na przykład w systemie Debian Linux możesz użyć:
locale -a
aby wyświetlić wszystkie wygenerowane lokalizacje. Oraz:
dpkg-reconfigure locales
jako użytkownik root (jeden sposób na kilka), aby generować / instalować więcej.