Maison >base de données >tutoriel mysql >Comment PostgreSQL peut-il trier des chaînes mixtes de mots et de chiffres dans un ordre convivial ?

Comment PostgreSQL peut-il trier des chaînes mixtes de mots et de chiffres dans un ordre convivial ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-07 22:55:42527parcourir

How Can PostgreSQL Sort Mixed Word-and-Number Strings in a Human-Friendly Order?

Tri PostgreSQL convivial des chaînes alphanumériques mixtes

Le tri humain des chaînes alphanumériques mixtes dans PostgreSQL est un défi unique. Un ordre de tri idéal donnerait la priorité aux chiffres plutôt qu'aux lettres, en plaçant « 3 » avant « 20 » et « fred » après « 10bob ».

Diviser la chaîne en composants numériques et chaîne

Une solution consiste à diviser chaque chaîne en morceaux aux limites alphanumériques. Par exemple, « AAA2fred » deviendrait (« AAA », 2, « fred »). Cette séparation permet un tri séparé basé sur le type de données, en utilisant les règles de classement normales pour les blocs alphabétiques et en traitant les blocs numériques comme des nombres entiers.

En utilisant la fonction regexp_matches() et le mode '(D*)(d*)' avec l'option 'g', nous pouvons extraire ces composants de chaque chaîne et utiliser array_agg() pour créer un tableau ai (un composé de champs de texte et d'entiers taper).

Trier les données fractionnées

Après avoir divisé et converti la chaîne en un tableau de types composites, nous pouvons utiliser ces tableaux pour le tri. La clause ORDER BY utilise ce tableau pour garantir que les blocs de lettres conservent leur ordre d'origine dans les blocs de chiffres.

Solution complète

En combinant les étapes de fractionnement et de tri des chaînes, nous pouvons obtenir le tri de type humain souhaité en utilisant la requête suivante :

<code class="language-sql">SELECT data
FROM alnum
ORDER BY ARRAY(SELECT ROW(x[1], CASE x[2] WHEN '' THEN '0' ELSE x[2] END)::ai
                FROM regexp_matches(data, '(\D*)(\d*)', 'g') x)
        , data;</code>

Cette solution fonctionne bien pour les données arbitraires avec un nombre variable d'éléments dans chaque chaîne et offre une approche flexible qui peut être personnalisée en fonction de vos besoins de tri spécifiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn