PostgreSQL の英数字混在文字列の人間に優しい並べ替え
PostgreSQL で英数字が混在した文字列を人道的に並べ替えるのは、独特の課題です。理想的な並べ替え順序では、文字よりも数字が優先され、「20」の前に「3」が配置され、「10bob」の後に「fred」が配置されます。
文字列を数値コンポーネントと文字列コンポーネントに分割します
1 つの方法は、各文字列を英数字の境界でチャンクに分割することです。たとえば、「AAA2fred」は (「AAA」, 2, 「fred」) になります。この分離により、アルファベット ブロックの通常の照合規則を使用し、数値ブロックを整数として扱うことで、データ型に基づいて個別に並べ替えることができます。
regexp_matches()
関数と '(D*)(d*)'
オプションを指定した 'g'
モードを使用すると、各文字列のこれらのコンポーネントを抽出し、array_agg()
を使用して ai
配列 (テキスト フィールドと整数フィールドの複合体) を作成できます。タイプ)。
分割データを並べ替えます
文字列を分割して複合型の配列に変換した後、これらの配列を並べ替えに使用できます。 ORDER BY
句はこの配列を利用して、文字ブロックが数字ブロック内で元の順序を維持するようにします。
完全な解決策
文字列の分割と並べ替えの手順を組み合わせると、次のクエリを使用して、望ましい人間のような並べ替えを実現できます:
<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 はどのようにして単語と数字が混在した文字列を人間に優しい順序で並べ替えることができるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。