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

Alfanumerisk ufølsom sortering i postgres

Min PostgreSQL sorterer som du vil. Måden PostgreSQL sammenligner strenge på, bestemmes af lokalitet og sortering. Når du opretter database ved hjælp af createdb der er -l mulighed for at indstille lokalitet. Du kan også tjekke, hvordan det er konfigureret i dit miljø ved hjælp af 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 |

Som du kan se, bruger min database polsk sortering.

Hvis du har oprettet database ved hjælp af anden sortering, kan du bruge anden sortering i forespørgslen ligesom:

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

Du kan liste tilgængelige sorteringer ved at:

SELECT * FROM pg_collation;

REDIGERET:

Åh, jeg savnede, at 'a11' skal være før 'a2'.

Jeg tror ikke, at standardsortering kan løse alfanumerisk sortering. For sådan sortering bliver du nødt til at opdele strengen i dele ligesom i Clodoaldo Neto-svaret. En anden mulighed, der er nyttig, hvis du ofte skal bestille på denne måde, er at adskille navnefeltet i to kolonner. Du kan oprette trigger på INSERT og UPDATE, der deler name ind i name_1 og name_2 og derefter:

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

(Jeg ændrede sortering fra polsk til engelsk, du bør bruge din oprindelige sortering til at sortere bogstaver som aącć osv.)



  1. Find det N'te minimum af en Varchar-værdi i Oracle

  2. hvordan man henter flere resultatsæt fra en mysql-lagret procedure i laravel

  3. Hvordan henter man fra MySql-databasen, når man bruger Include-forbindelse?

  4. Skal SELECT ... FOR UPDATE altid indeholde ORDER BY?