"Normalisera" för sortering
Du kunde använd regexp_replace()
med mönstret '[^a-zA-Z]'
i ORDER BY
men som bara känner igen rena ASCII-bokstäver. Bättre använd klassstenografin '\W'
som känner igen ytterligare icke-ASCII-bokstäver i din lokalitet som äüóèß
etc.Eller du kunde improvisera och "normalisera alla tecken med diakritiska element till deras basform med hjälp av unaccent()
fungera. Tänk på denna lilla 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 för Postgres 9.2.
->SQLfiddle för Postgres 9.1.
Koden för reguljära uttryck har uppdaterats i version 9.2. Jag antar detta är anledningen till den förbättrade hanteringen i 9.2 där alla bokstavstecken i exemplet matchas, medan 9.1 bara matchar några.
unaccent()
tillhandahålls av tilläggsmodulen unaccent
. Kör:
CREATE EXTENSION unaccent;
en gång per databas att använda i (Postgres 9.1+, äldre versioner använder en annan teknik ).
lokal/sortering
Du måste vara medveten om att Postgres förlitar sig på det underliggande operativsystemet för lokaler (inklusive sortering). Sorteringsordningen styrs av ditt valda språk, eller mer specifikt LC_COLLATE
. Mer i detta relaterade svar:
Sorteringsordning för strängar (LC_COLLATE och LC_CTYPE)
Det finns planer på att integrera sorteringsstöd direkt i Postgres , men det är inte tillgängligt just nu.
Många språk ignorerar specialtecken du beskriver för att sortera teckendata utanför lådan. Om du har en lokal installerad i ditt system som ger den sorteringsordning du letar efter kan du använda den ad-hoc i Postgres 9.1 eller senare:
SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"
För att se vilka sorteringar som är installerade och tillgängliga i din nuvarande Postgres-installation:
SELECT * FROM pg_collation;
Tyvärr är det inte möjligt att definiera din egen anpassade sortering (ännu) om du inte hackar källkoden.
Sammanställningsreglerna styrs vanligtvis av reglerna för ett språk som talas i ett land. Sorteringsordningen telefonböcker skulle vara i, om det fortfarande fanns telefonböcker ... Ditt operativsystem tillhandahåller dem.
Till exempel, i Debian Linux kan du använda:
locale -a
för att visa alla genererade språkinställningar. Och:
dpkg-reconfigure locales
som root-användare (ett sätt av flera) för att generera/installera fler.