"Normaliser" pour le tri
Vous pourriez utilisez regexp_replace()
avec le motif '[^a-zA-Z]'
dans le ORDER BY
clause mais qui ne reconnaît que les lettres ASCII pures. Mieux vaut utiliser le raccourci de classe '\W'
qui reconnaît les lettres non-ASCII supplémentaires dans vos paramètres régionaux comme äüóèß
etc.Ou vous pourriez improviser et "normaliser tous les caractères avec des éléments diacritiques à leur forme de base à l'aide de unaccent()
fonction. Considérez cette petite démo :
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 pour Postgres 9.2.
->SQLfiddle pour Postgres 9.1.
Le code des expressions régulières a été mis à jour dans la version 9.2. Je suppose c'est la raison de l'amélioration de la gestion dans 9.2 où tous les caractères alphabétiques de l'exemple correspondent, alors que 9.1 n'en correspond qu'à certains.
unaccent()
est fourni par le module supplémentaire unaccent
. Exécuter :
CREATE EXTENSION unaccent;
une fois par base de données à utiliser dans (Postgres 9.1+, les anciennes versions utilisent un technique différente ).
paramètres régionaux / classement
Vous devez savoir que Postgres s'appuie sur le système d'exploitation sous-jacent pour les paramètres régionaux (y compris le classement). L'ordre de tri est régi par les paramètres régionaux que vous avez choisis, ou plus spécifiques LC_COLLATE
. Plus dans cette réponse connexe :
Ordre de tri des chaînes (LC_COLLATE et LC_CTYPE)
Il existe des plans pour intégrer directement la prise en charge du classement dans Postgres , mais ce n'est pas disponible pour le moment.
De nombreux paramètres régionaux ignorent les caractères spéciaux que vous décrivez pour trier les données de caractères hors de la boîte. Si vous avez une locale installée sur votre système qui fournit l'ordre de tri que vous recherchez, vous pouvez l'utiliser ad hoc dans Postgres 9.1 ou version ultérieure :
SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"
Pour voir quels classements sont installés et disponibles dans votre installation Postgres actuelle :
SELECT * FROM pg_collation;
Malheureusement, il n'est pas (encore) possible de définir votre propre classement personnalisé à moins de pirater le code source.
Les règles de classement sont généralement régies par les règles d'une langue telle qu'elle est parlée dans un pays. L'ordre de tri des annuaires téléphoniques serait dans s'il y avait encore des annuaires téléphoniques... Votre système d'exploitation les fournit.
Par exemple, dans Debian Linux, vous pouvez utiliser :
locale -a
pour afficher tous les paramètres régionaux générés. Et :
dpkg-reconfigure locales
en tant qu'utilisateur root (une manière parmi plusieurs) pour générer / installer plus.