Maison > base de données > tutoriel mysql > Comment puis-je trier humainement les chaînes alphanumériques dans PostgreSQL ?

Comment puis-je trier humainement les chaînes alphanumériques dans PostgreSQL ?

Patricia Arquette
Libérer: 2025-01-07 22:06:46
original
208 Les gens l'ont consulté

How Can I Sort Alphanumeric Strings Humanely in PostgreSQL?

Tri humanisé des chaînes dans PostgreSQL

Trier humainement les chaînes contenant un mélange de lettres et de chiffres peut être difficile dans PostgreSQL, mais peut être réalisé en utilisant une combinaison de regexp_matches() et d'agrégation de tableaux.

Chaîne divisée

La première étape consiste à diviser chaque chaîne en ses parties alphabétiques et numériques constitutives. Cela peut être fait en utilisant la fonction regexp_matches() et des expressions régulières comme (D*)(d*). Le tableau de correspondances résultant peut ensuite être itéré pour créer un tableau de paires, chaque paire contenant une valeur texte et une valeur entière.

Trier ces paires

L'étape suivante consiste à trier ces paires de valeurs selon l'ordre convivial souhaité. Les valeurs de texte peuvent être triées dans l'ordre de tri normal des chaînes, tandis que les valeurs entières peuvent être triées sous forme d'entiers.

Recombiner les chaînes

Enfin, les paires triées peuvent être utilisées pour remonter la ficelle d'origine dans l'ordre personnalisé souhaité.

PostgreSQL 9.4 ou supérieur

Dans PostgreSQL 9.4 ou version ultérieure, la requête suivante peut être utilisée :

<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>
Copier après la connexion

PostgreSQL 9.1

Dans PostgreSQL 9.1, vous pouvez utiliser la requête suivante :

<code class="language-sql">SELECT data
FROM  (
    SELECT ctid, data, regexp_matches(data, '(\D*)(\d*)', 'g') AS x
    FROM   alnum
    ) x
GROUP  BY ctid, data   -- ctid 作为缺少主键的替代
ORDER  BY regexp_replace (left(data, 1), '[0-9]', '0')
        , array_agg(ROW(x[1], CASE x[2] WHEN '' THEN '0' ELSE x[2] END)::ai)
        , data         -- 用于处理尾随 0 的特殊情况</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal