sql >> Database >  >> RDS >> PostgreSQL

Alfanumeriek hoofdlettergevoelig sorteren in postgres

Mijn PostgreSQL sorteert zoals u dat wilt. De manier waarop PostgreSQL tekenreeksen vergelijkt, wordt bepaald door de landinstelling en sortering. Wanneer u een database maakt met createdb er is -l optie om de landinstelling in te stellen. U kunt ook controleren hoe het in uw omgeving is geconfigureerd met 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 |

Zoals je ziet, gebruikt mijn database Poolse sortering.

Als u een database hebt gemaakt met een andere sortering, kunt u een andere sortering in de query gebruiken, net als:

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

U kunt beschikbare sorteringen weergeven op:

SELECT * FROM pg_collation;

BEWERKT:

Oh, ik heb gemist dat 'a11' voor 'a2' moet staan.

Ik denk niet dat standaardsortering alfanumeriek sorteren kan oplossen. Voor een dergelijke sortering moet je string in delen splitsen, net als in Clodoaldo Neto-reactie. Een andere optie die handig is als u vaak op deze manier moet bestellen, is om het naamveld in twee kolommen te splitsen. U kunt een trigger maken op INSERT en UPDATE die name splitsen in name_1 en name_2 en dan:

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

(Ik heb de sortering gewijzigd van het Pools in het Engels, u moet uw eigen sortering gebruiken om letters te sorteren, zoals aącć enz.)



  1. MySQL selecteer alle rijen van vorige maand tot (nu() - 1 maand), voor vergelijkingsdoeleinden

  2. Spring Batch:kon identiteit niet verhogen; geneste uitzondering is com.microsoft.sqlserver.jdbc.SQLServerException:ongeldige objectnaam 'BATCH_JOB_SEQ'?

  3. Herhaalde gebeurtenissen op de nde weekdag van elke maand

  4. PDO::fetchAll vs. PDO::fetch in a loop