Maison >base de données >tutoriel mysql >Comment puis-je effectuer un tri naturel de chaînes alphabétiques et numériques mixtes dans PostgreSQL ?

Comment puis-je effectuer un tri naturel de chaînes alphabétiques et numériques mixtes dans PostgreSQL ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-08 00:52:40157parcourir

How Can I Perform Natural Sorting of Mixed Alphabetic and Numeric Strings in PostgreSQL?

Tri naturel des chaînes alphanumériques mixtes PostgreSQL

Un défi inhérent au tri naturel de chaînes alphanumériques mixtes est de maintenir l'ordre des mots tout en traitant les nombres comme des nombres entiers. Dans PostgreSQL 9.1 et supérieur, une méthode pratique existe :

Types composites et opérations sur les tableaux :

  1. Créez un type composite appelé "ai" qui contient un champ de texte "a" et un champ entier "i".
  2. Divisez chaque chaîne en un tableau de valeurs "ai" à l'aide de la fonction "regexp_matches".

Exemple de requête (PostgreSQL 9.4 et versions ultérieures) :

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

Comment gérer PostgreSQL 9.1 :

Dans les anciennes versions de PostgreSQL, la requête doit être légèrement modifiée :

<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;</code>

Avec cette approche, le fractionnement de chaînes et le tri naturel deviennent réalisables dans PostgreSQL, permettant un tri intuitif de divers ensembles de données contenant des chaînes alphanumériques mixtes.

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