sql >> Databáze >  >> RDS >> PostgreSQL

Chcete-li ignorovat interpunkci na základě jednotlivých sloupců, nastavte Pořadí podle

"Normalizovat" pro řazení

Mohli byste použijte regexp_replace() se vzorem '[^a-zA-Z]' v ORDER BY klauzule, ale ta rozpozná pouze čistá písmena ASCII. Raději použijte třídní těsnopis '\W' který ve vašem národním prostředí rozpozná další písmena mimo ASCII, jako je äüóèß atd. Nebo můžete improvizovat a "normalizovat všechny znaky s diakritickými prvky do jejich základního tvaru pomocí unaccent() funkce. Zvažte toto malé 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 pro Postgres 9.2.
->SQLfiddle pro Postgres 9.1.

Kód regulárního výrazu byl aktualizován ve verzi 9.2. Předpokládám to je důvod pro vylepšené zpracování v 9.2, kde jsou všechna písmena v příkladu shodná, zatímco 9.1 odpovídá pouze některým.

unaccent() je poskytován doplňkovým modulem unaccent . Spustit:

CREATE EXTENSION unaccent;

jednou pro každou databázi k použití v (Postgres 9.1+, starší verze používají jiná technika ).

místní nastavení / řazení

Musíte si být vědomi toho, že Postgres spoléhá na základní operační systém pro národní prostředí (včetně řazení). Pořadí řazení se řídí vámi zvoleným národním prostředím nebo konkrétnějším LC_COLLATE . Více v této související odpovědi:
Pořadí řazení řetězců (LC_COLLATE a LC_CTYPE)

Existují plány začlenit podporu řazení přímo do Postgres , ale v tuto chvíli není k dispozici.

Mnoho národních prostředí ignoruje speciální znaky, které popisujete pro třídění znakových dat po vybalení. Pokud máte ve svém systému nainstalované národní prostředí, které poskytuje požadované pořadí řazení, můžete jej použít ad-hoc v Postgresu 9.1 nebo novějším:

SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"

Chcete-li zjistit, které kolace jsou nainstalovány a dostupné ve vaší aktuální instalaci Postgres:

SELECT * FROM pg_collation;

Bohužel není možné (zatím) definovat své vlastní řazení, pokud nenabouráte zdrojový kód.

Pravidla řazení se obvykle řídí pravidly jazyka, kterým se v dané zemi mluví. Telefonní seznamy by byly v pořadí řazení, pokud by stále existovaly telefonní seznamy... Váš operační systém je poskytuje.

Například v Debian Linuxu můžete použít:

locale -a

pro zobrazení všech vygenerovaných lokalit. A:

dpkg-reconfigure locales

jako uživatel root (jeden způsob z několika) generovat / instalovat další.



  1. Speciální znaky v názvu tabulky MySQL

  2. Chyba PID při startu mysql.server?

  3. Proč se prodlužují doby dávkování vložek?

  4. Jak popsat problém s výkonem v relační databázi?