PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ordinamento alfanumerico senza distinzione tra maiuscole e minuscole in postgres

Il mio PostgreSQL ordina nel modo desiderato. Il modo in cui PostgreSQL confronta le stringhe è determinato dalle impostazioni locali e dalle regole di confronto. Quando crei un database usando createdb c'è -l opzione per impostare la localizzazione. Inoltre puoi controllare come è configurato nel tuo ambiente 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 |

Come puoi vedere, il mio database utilizza le regole di confronto polacche.

Se hai creato un database utilizzando altre regole di confronto, puoi utilizzare altre regole di confronto nella query, proprio come:

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";

Puoi elencare le regole di confronto disponibili per:

SELECT * FROM pg_collation;

MODIFICATO:

Oh, mi era sfuggito che 'a11' deve essere prima di 'a2'.

Non credo che le regole di confronto standard possano risolvere l'ordinamento alfanumerico. Per tale ordinamento dovrai dividere la stringa in parti proprio come nella risposta di Clodoaldo Neto. Un'altra opzione utile se devi spesso ordinare in questo modo è separare il campo del nome in due colonne. Puoi creare trigger su INSERT e UPDATE che dividono name in name_1 e name_2 e poi:

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

(Ho cambiato le regole di confronto dal polacco all'inglese, dovresti usare le tue regole di confronto native per ordinare lettere come aącć ecc.)