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中文网其他相关文章!