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