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 中国語 Web サイトの他の関連記事を参照してください。