sql >> Databáze >  >> RDS >> PostgreSQL

Alfanumerické třídění bez ohledu na velikost písmen v postgresu

Můj PostgreSQL třídí tak, jak chcete. Způsob, jakým PostgreSQL porovnává řetězce, je určen národním prostředím a řazením. Když vytvoříte databázi pomocí createdb existuje -l možnost nastavení národního prostředí. Také můžete zkontrolovat, jak je nakonfigurován ve vašem prostředí pomocí 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 |

Jak vidíte, moje databáze používá polské řazení.

Pokud jste vytvořili databázi pomocí jiného řazení, můžete v dotazu použít jiné řazení stejně jako:

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

Dostupné porovnávání můžete vypsat podle:

SELECT * FROM pg_collation;

UPRAVENO:

Oh, přehlédl jsem, že 'a11' musí být před 'a2'.

Nemyslím si, že standardní řazení dokáže vyřešit alfanumerické řazení. Pro takové třídění budete muset rozdělit řetězec na části stejně jako v odpovědi Clodoaldo Neto. Další možností, která je užitečná, pokud často musíte objednávat tímto způsobem, je oddělit pole názvu do dvou sloupců. Můžete vytvořit spouštěč na INSERT a UPDATE, který rozdělí name do name_1 a name_2 a poté:

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

(Změnil jsem řazení z polštiny na angličtinu, k řazení písmen jako aącć atd. byste měli použít své nativní řazení)



  1. Master High Availability Manager (MHA) se zhroutil! Co teď dělám?

  2. Odstranit duplicitní řádky na základě pole ve výběrovém dotazu pomocí PostgreSQL?

  3. Vložit více dat do MySQL a aktualizovat, pokud existují

  4. Mám odpojit (), pokud používám connect_cached () Apache::DBI?