sql >> Database teknologi >  >> RDS >> PostgreSQL

Indstil rækkefølge efter for at ignorere tegnsætning pr. kolonne

"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.



  1. Hent store clob-data ved hjælp af sqlplus

  2. Optimering af MySQL ORDER BY på en beregning delt med WHERE

  3. Stop eller afslut langvarig forespørgsel i JDBC

  4. SQL-værdi af tidligere (ukendt) dato