ホームページ > データベース > mysql チュートリアル > PostgreSQL で英数字の文字列を人道的にソートするにはどうすればよいですか?

PostgreSQL で英数字の文字列を人道的にソートするにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-07 22:06:46
オリジナル
261 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート