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>
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>
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!