sql >> Databasteknik >  >> RDS >> PostgreSQL

Alfanumeriskt skiftläge okänslig sortering i postgres

Min PostgreSQL sorterar som du vill. Sättet PostgreSQL jämför strängar på bestäms av lokalitet och sortering. När du skapar en databas med createdb det finns -l alternativet för att ställa in språk. Du kan också kontrollera hur den är konfigurerad i din miljö med 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 ser använder min databas polsk sortering.

Om du skapade en databas med hjälp av annan sortering kan du använda annan sortering i frågan precis som:

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 lista tillgängliga sorteringar genom att:

SELECT * FROM pg_collation;

REDIGERAD:

Åh, jag missade att 'a11' måste vara före 'a2'.

Jag tror inte att standardsortering kan lösa alfanumerisk sortering. För sådan sortering måste du dela upp strängen i delar precis som i Clodoaldo Neto-svar. Ett annat alternativ som är användbart om du ofta måste beställa på detta sätt är att dela upp namnfältet i två kolumner. Du kan skapa trigger på INSERT och UPPDATERA som delar upp name till name_1 och name_2 och sedan:

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

(Jag ändrade sortering från polska till engelska, du bör använda din inhemska sortering för att sortera bokstäver som aącć etc.)



  1. Slumpmässig post från en databastabell (T-SQL)

  2. Hur ställer jag in en kollation med mysqli?

  3. R:[unixODBC][Driver Manager]Kan inte öppna lib 'SQL Server':filen hittades inte

  4. I PHP fick klassen 'PDO' inte ett fel vid försök att ansluta till Oracle DB