"Normaliser" til sortering
Du kunne brug regexp_replace()
med mønsteret '[^a-zA-Z]'
i ORDER BY
klausul, men som kun genkender rene ASCII-bogstaver. Brug hellere klassenstenografien '\W'
som genkender yderligere ikke-ASCII-bogstaver i din lokalitet som äüóèß
osv. Eller du kunne improviser og "normaliser alle tegn med diakritiske elementer til deres grundform ved hjælp af unaccent()
fungere. Overvej denne lille 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 til Postgres 9.2.
->SQLfiddle til Postgres 9.1.
Regulære udtrykskode er blevet opdateret i version 9.2. Jeg går ud fra dette er årsagen til den forbedrede håndtering i 9.2, hvor alle bogstavtegn i eksemplet matches, mens 9.1 kun matcher nogle.
unaccent()
leveres af det ekstra modul unaccent
. Kør:
CREATE EXTENSION unaccent;
én gang pr. database, der skal bruges i (Postgres 9.1+, ældre versioner bruger en anden teknik ).
lokaliteter / sortering
Du skal være opmærksom på, at Postgres er afhængig af det underliggende operativsystem til lokaliteter (inklusive sortering). Sorteringsrækkefølgen er styret af din valgte lokalitet eller mere specifik LC_COLLATE
. Mere i dette relaterede svar:
Sorteringsrækkefølge for strenge (LC_COLLATE og LC_CTYPE)
Der er planer om at inkorporere sorteringsstøtte direkte i Postgres , men det er ikke tilgængeligt på nuværende tidspunkt.
Mange lokaliteter ignorerer de specialtegn, du beskriver, for at sortere tegndata ud af boksen. Hvis du har en lokalitet installeret i dit system, der giver den sorteringsrækkefølge, du leder efter, kan du bruge den ad hoc i Postgres 9.1 eller nyere:
SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"
For at se hvilke sorteringer der er installeret og tilgængelige i din nuværende Postgres-installation:
SELECT * FROM pg_collation;
Desværre er det ikke muligt at definere din egen tilpassede sortering (endnu), medmindre du hacker kildekoden.
Samlingsreglerne er normalt styret af reglerne for et sprog, som det tales i et land. Sorteringsrækkefølgen telefonbøger ville være i, hvis der stadig var telefonbøger ... Dit operativsystem leverer dem.
For eksempel, i Debian Linux kan du bruge:
locale -a
for at vise alle genererede lokaliteter. Og:
dpkg-reconfigure locales
som root-bruger (en måde af flere) for at generere / installere mere.