"Нормализиране" за сортиране
Вие можете използвайте regexp_replace()
с модела '[^a-zA-Z]'
в ORDER BY
клауза, но това разпознава само чисти ASCII букви. По-добре използвайте стенография на класа '\W'
който разпознава допълнителни не-ASCII букви във вашия локал като äüóèß
и т.н. Или можете импровизирайте и "нормализирайте всички знаци с диакритични елементи към основната им форма с помощта на unaccent()
функция. Помислете за тази малка демонстрация:
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 за Postgres 9.2.
->SQLfiddle за Postgres 9.1.
Кодът на регулярния израз е актуализиран във версия 9.2. Предполагам това е причината за подобрената обработка в 9.2, където всички букви в примера са съпоставени, докато 9.1 съвпада само с някои.
unaccent()
се предоставя от допълнителния модул unaccent
. Изпълнение:
CREATE EXTENSION unaccent;
веднъж на база данни за използване в (Postgres 9.1+, по-старите версии използват различна техника ).
локали / сортиране
Трябва да сте наясно, че Postgres разчита на основната операционна система за локали (включително сортиране). Редът на сортиране се управлява от избрания от вас локал или по-конкретно LC_COLLATE
. Повече в този свързан отговор:
Ред на сортиране на низове (LC_COLLATE и LC_CTYPE)
Има планове за директно включване на поддръжка за сортиране в Postgres , но това не е налично в момента.
Много локали пренебрегват специалните символи, които описвате за сортиране на данни за символи извън кутията. Ако имате инсталиран локал във вашата система, който осигурява реда на сортиране, който търсите, можете да го използвате ad hoc в Postgres 9.1 или по-нова версия:
SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"
За да видите кои сортирания са инсталирани и налични в текущата ви инсталация на Postgres:
SELECT * FROM pg_collation;
За съжаление не е възможно да дефинирате свое собствено персонализирано сортиране (все още), освен ако не хакнете изходния код.
Правилата за съпоставяне обикновено се управляват от правилата на езика, който се говори в дадена страна. Редът на сортиране на телефонните указатели би бил, ако все още имаше телефонни указатели... Вашата операционна система ги предоставя.
Например в Debian Linux можете да използвате:
locale -a
за показване на всички генерирани локали. И:
dpkg-reconfigure locales
като root потребител (един начин от няколко), за да генерирате/инсталирате повече.