sql >> Base de Datos >  >> RDS >> PostgreSQL

Establezca Ordenar por para ignorar la puntuación por columna

"Normalizar" para ordenar

podrías usa regexp_replace() con el patrón '[^a-zA-Z]' en el ORDER BY pero que solo reconoce letras ASCII puras. Mejor use la taquigrafía de clase '\W' que reconoce letras adicionales que no son ASCII en su configuración regional como äüóèß etc. O usted podría improvisar y "normalizar todos los caracteres con elementos diacríticos a su forma base con la ayuda de unaccent() función. Considere esta pequeña demostración:

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 para Postgres 9.2.
->SQLfiddle para Postgres 9.1.

El código de expresión regular se ha actualizado en la versión 9.2. Estoy suponiendo esta es la razón del manejo mejorado en 9.2 donde todos los caracteres de letras en el ejemplo coinciden, mientras que 9.1 solo coincide con algunos.

unaccent() es proporcionado por el módulo adicional unaccent . Ejecutar:

CREATE EXTENSION unaccent;

una vez por base de datos para usar (Postgres 9.1+, las versiones anteriores usan un técnica diferente ).

locales / colación

Debe tener en cuenta que Postgres se basa en el sistema operativo subyacente para las configuraciones regionales (incluida la intercalación). El orden de clasificación se rige por la configuración regional elegida, o más específica LC_COLLATE . Más en esta respuesta relacionada:
Orden de clasificación de cadenas (LC_COLLATE y LC_CTYPE)

Hay planes para incorporar soporte de intercalación en Postgres directamente , pero eso no está disponible en este momento.

Muchas configuraciones regionales ignoran los caracteres especiales que usted describe para clasificar los datos de caracteres de la caja. Si tiene una configuración regional instalada en su sistema que proporciona el orden de clasificación que está buscando, puede usarla ad-hoc en Postgres 9.1 o posterior:

SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"

Para ver qué intercalaciones están instaladas y disponibles en su instalación actual de Postgres:

SELECT * FROM pg_collation;

Desafortunadamente, no es posible definir su propia intercalación personalizada (todavía) a menos que piratee el código fuente.

Las reglas de colación generalmente se rigen por las reglas de un idioma tal como se habla en un país. El orden de clasificación en el que estarían las guías telefónicas, si todavía hubiera guías telefónicas... Su sistema operativo las proporciona.

Por ejemplo, en Debian Linux puede usar:

locale -a

para mostrar todas las configuraciones regionales generadas. Y:

dpkg-reconfigure locales

como usuario root (una forma de varias) para generar/instalar más.