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

Clasificación alfanumérica que no distingue entre mayúsculas y minúsculas en postgres

Mi PostgreSQL ordena de la forma que desea. La forma en que PostgreSQL compara las cadenas está determinada por la configuración regional y la intercalación. Cuando creas una base de datos usando createdb hay -l opción para establecer la configuración regional. También puede verificar cómo está configurado en su entorno usando psql -l :

[[email protected]]$ psql -l
List of databases
 Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
---------+----------+----------+------------+------------+-----------------------
 mn_test | postgres | UTF8     | pl_PL.UTF8 | pl_PL.UTF8 |

Como puede ver, mi base de datos utiliza la colación polaca.

Si creó una base de datos usando otra intercalación, entonces puede usar otra intercalación en la consulta como:

SELECT * FROM sort_test ORDER BY name COLLATE "C";
SELECT * FROM sort_test ORDER BY name COLLATE "default";
SELECT * FROM sort_test ORDER BY name COLLATE "pl_PL";

Puede enumerar las intercalaciones disponibles por:

SELECT * FROM pg_collation;

EDITADO:

Oh, me perdí que 'a11' debe estar antes de 'a2'.

No creo que la intercalación estándar pueda resolver la clasificación alfanumérica. Para tal clasificación, deberá dividir la cadena en partes como en la respuesta de Clodoaldo Neto. Otra opción útil si tiene que realizar pedidos de esta manera con frecuencia es separar el campo de nombre en dos columnas. Puede crear un disparador en INSERTAR y ACTUALIZAR que divida name en name_1 y name_2 y luego:

SELECT name FROM sort_test ORDER BY name_1 COLLATE "en_EN", name_2;

(Cambié la intercalación de polaco a inglés, debe usar su intercalación nativa para ordenar letras como aącć, etc.)