PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Ustaw Kolejność według, aby ignorować interpunkcję na podstawie kolumn

„Normalizuj” do sortowania

możesz użyj regexp_replace() ze wzorcem '[^a-zA-Z]' w ORDER BY klauzula, ale rozpoznaje tylko czyste litery ASCII. Lepiej użyj skrótu klasy '\W' który rozpoznaje dodatkowe litery spoza ASCII w Twoim języku, takie jak äüóèß itp. Lub możesz improwizować i "normalizować wszystkie znaki z elementami diakrytycznymi do ich formy bazowej za pomocą unaccent() funkcjonować. Rozważ to małe 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 dla Postgresa 9.2.
->SQLfiddle dla Postgres 9.1.

Kod wyrażeń regularnych został zaktualizowany w wersji 9.2. zakładam jest to powód ulepszonej obsługi w wersji 9.2, w której wszystkie znaki literowe w przykładzie są dopasowywane, podczas gdy w wersji 9.1 dopasowuje się tylko niektóre.

unaccent() jest dostarczany przez dodatkowy moduł unaccent . Uruchom:

CREATE EXTENSION unaccent;

raz na bazę danych do użycia w (Postgres 9.1+, starsze wersje używają inna technika ).

lokalizacje / zestawienie

Musisz mieć świadomość, że Postgres opiera się na podstawowym systemie operacyjnym dla ustawień regionalnych (w tym sortowania). Porządek sortowania zależy od wybranej lokalizacji lub bardziej szczegółowej LC_COLLATE . Więcej w tej powiązanej odpowiedzi:
Porządek sortowania ciągów (LC_COLLATE i LC_CTYPE)

Istnieją plany bezpośredniego włączenia obsługi sortowania do Postgresa , ale obecnie nie jest to dostępne.

Wiele ustawień regionalnych ignoruje znaki specjalne, które opisujesz do sortowania danych znakowych po wyjęciu z pudełka. Jeśli masz zainstalowaną lokalizację w swoim systemie, która zapewnia porządek sortowania, którego szukasz, możesz użyć jej ad-hoc w Postgresie 9.1 lub nowszym:

SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"

Aby zobaczyć, które sortowania są zainstalowane i dostępne w bieżącej instalacji Postgresa:

SELECT * FROM pg_collation;

Niestety nie jest możliwe zdefiniowanie własnego niestandardowego sortowania (jeszcze), chyba że zhakujesz kod źródłowy.

Reguły sortowania są zwykle regulowane przez reguły języka używanego w danym kraju. Porządek sortowania książek telefonicznych byłby w porządku, gdyby nadal istniały książki telefoniczne ... Twój system operacyjny je zapewnia.

Na przykład w systemie Debian Linux możesz użyć:

locale -a

aby wyświetlić wszystkie wygenerowane lokalizacje. Oraz:

dpkg-reconfigure locales

jako użytkownik root (jeden sposób na kilka), aby generować / instalować więcej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ustaw poziom izolacji dla procedur składowanych postgresql

  2. Włączenie niestandardowej klauzuli SELECT w zapytaniu ActiveRecord

  3. Podział dat na podstawie roku obrotowego

  4. Przegląd szeregowych pseudotypów danych dla PostgreSQL

  5. Zaznaczanie wszystkich rekordów za pomocą zapytania SQL LIMIT i OFFSET