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

Imposta Ordine per per ignorare la punteggiatura in base alla colonna

"Normalizza" per l'ordinamento

Potresti usa regexp_replace() con lo schema '[^a-zA-Z]' nel ORDER BY clausola ma che riconosce solo lettere ASCII pure. Utilizzare meglio la abbreviazione di classe '\W' che riconosce ulteriori lettere non ASCII nella tua locale come äüóèß ecc. Oppure potresti improvvisare e "normalizzare tutti i caratteri con elementi diacritici nella loro forma base con l'aiuto di unaccent() funzione. Considera questa piccola 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 per Postgres 9.2.
->SQLfiddle per Postgres 9.1.

Il codice delle espressioni regolari è stato aggiornato nella versione 9.2. Sto supponendo questo è il motivo della migliore gestione in 9.2 in cui tutti i caratteri delle lettere nell'esempio sono abbinati, mentre 9.1 ne corrisponde solo alcuni.

unaccent() è fornito dal modulo aggiuntivo unaccent . Corri:

CREATE EXTENSION unaccent;

una volta per database da utilizzare in (Postgres 9.1+, le versioni precedenti utilizzano un tecnica diversa ).

locali / confronto

Devi essere consapevole del fatto che Postgres si basa sul sistema operativo sottostante per le impostazioni locali (incluse le regole di confronto). L'ordinamento è regolato dalla lingua scelta o da LC_COLLATE . Altro in questa risposta correlata:
Ordinamento delle stringhe (LC_COLLATE e LC_CTYPE)

Ci sono piani per incorporare il supporto per la raccolta direttamente in Postgres , ma al momento non è disponibile.

Molte impostazioni locali ignorano i caratteri speciali che descrivi per ordinare i dati dei caratteri fuori dagli schemi. Se hai una locale installata nel tuo sistema che fornisce l'ordinamento che stai cercando, puoi usarla ad hoc in Postgres 9.1 o versioni successive:

SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"

Per vedere quali regole di confronto sono installate e disponibili nella tua attuale installazione di Postgres:

SELECT * FROM pg_collation;

Sfortunatamente non è possibile definire (ancora) le tue regole di confronto personalizzate a meno che tu non modifichi il codice sorgente.

Le regole di confronto sono generalmente regolate dalle regole di una lingua parlata in un paese. L'ordinamento delle rubriche telefoniche si troverebbe, se ci fossero ancora rubriche telefoniche... Il tuo sistema operativo le fornisce.

Ad esempio, in Debian Linux puoi usare:

locale -a

per visualizzare tutte le impostazioni locali generate. E:

dpkg-reconfigure locales

come utente root (uno dei tanti) per generarne/installarne altri.