首頁 >資料庫 >mysql教程 >如何在 PostgreSQL 中對字母數字字串進行人性化排序?

如何在 PostgreSQL 中對字母數字字串進行人性化排序?

Patricia Arquette
Patricia Arquette原創
2025-01-07 22:06:46218瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn