首页 > 数据库 > mysql教程 > 如何在 PostgreSQL 中对字母数字字符串进行人性化排序?

如何在 PostgreSQL 中对字母数字字符串进行人性化排序?

Patricia Arquette
发布: 2025-01-07 22:06:46
原创
208 人浏览过

How Can I Sort Alphanumeric Strings Humanely in PostgreSQL?

PostgreSQL 中的人性化字符串排序

在 PostgreSQL 中,对包含字母和数字混合的字符串进行人性化排序可能具有挑战性,但可以使用 regexp_matches() 和数组聚合的组合来实现。

分割字符串

第一步是将每个字符串分割成其组成的字母和数字部分。这可以使用 regexp_matches() 函数和类似 (D*)(d*) 的正则表达式来完成。然后可以迭代生成的匹配数组,以创建成对的数组,每一对都包含一个文本值和一个整数值。

排序这些对

下一步是根据所需的人性化顺序对这些值对进行排序。文本值可以按照正常的字符串排序顺序排序,而整数值可以作为整数排序。

重新组合字符串

最后,可以使用排序后的对以所需的个性化顺序重新组合原始字符串。

PostgreSQL 9.4 或更高版本

在 PostgreSQL 9.4 或更高版本中,可以使用以下查询:

<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

在 PostgreSQL 9.1 中,可以使用以下查询:

<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>
登录后复制

以上是如何在 PostgreSQL 中对字母数字字符串进行人性化排序?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板