'Normaliseren' voor sorteren
Je zou gebruik regexp_replace()
met het patroon '[^a-zA-Z]'
in de ORDER BY
clausule, maar die alleen zuivere ASCII-letters herkent. Gebruik de steno van de klasse '\W'
die aanvullende niet-ASCII-letters in uw land herkent, zoals äüóèß
enz. Of je zou improviseer en "normaliseer alle tekens met diakritische elementen naar hun basisvorm met behulp van de unaccent()
functie. Overweeg deze kleine 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 voor Postgres 9.2.
->SQLfiddle voor Postgres 9.1.
Reguliere expressiecode is bijgewerkt in versie 9.2. Ik aangenomen dit is de reden voor de verbeterde verwerking in 9.2 waar alle lettertekens in het voorbeeld overeenkomen, terwijl 9.1 slechts enkele overeenkomt.
unaccent()
wordt geleverd door de aanvullende module unaccent
. Uitvoeren:
CREATE EXTENSION unaccent;
eenmaal per database om in te gebruiken (Postgres 9.1+, oudere versies gebruiken een andere techniek ).
landinstellingen / verzameling
U moet zich ervan bewust zijn dat Postgres afhankelijk is van het onderliggende besturingssysteem voor landinstellingen (inclusief sortering). De sorteervolgorde wordt bepaald door de door u gekozen landinstelling, of meer specifiek LC_COLLATE
. Meer in dit gerelateerde antwoord:
String-sorteervolgorde (LC_COLLATE en LC_CTYPE)
Er zijn plannen om sorteerondersteuning rechtstreeks in Postgres op te nemen , maar dat is momenteel niet beschikbaar.
Veel landinstellingen negeren de speciale tekens die u beschrijft voor het sorteren van tekengegevens uit de doos. Als u een landinstelling in uw systeem hebt geïnstalleerd die de sorteervolgorde biedt die u zoekt, kunt u deze ad-hoc gebruiken in Postgres 9.1 of hoger:
SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"
Om te zien welke sorteringen zijn geïnstalleerd en beschikbaar zijn in uw huidige Postgres-installatie:
SELECT * FROM pg_collation;
Helaas is het (nog) niet mogelijk om je eigen aangepaste sortering te definiëren, tenzij je de broncode hackt.
De sorteerregels worden meestal bepaald door de regels van een taal zoals die in een land wordt gesproken. De telefoonboeken in sorteervolgorde zouden in zijn, als er nog telefoonboeken waren ... Uw besturingssysteem biedt ze.
In Debian Linux kunt u bijvoorbeeld het volgende gebruiken:
locale -a
om alle gegenereerde landinstellingen weer te geven. En:
dpkg-reconfigure locales
als root-gebruiker (een van de meerdere) om meer te genereren / installeren.