sql >> Databasteknik >  >> RDS >> PostgreSQL

Ställ in ordning efter för att ignorera skiljetecken per kolumn

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



  1. Parsar OpenXML med flera element med samma namn

  2. Anslutning med mysql med netbeans för jsp

  3. åtkomst nekad för användarrot @ localhost

  4. Flera räkningar med olika villkor i en enda MySQL-fråga