最近の数日間は、自然順序で英数字テキストのリストをソートしようとしていました.NLS_SORTオプションを使用すると、リストを正しく並べ替えることができました(see this answer) 。しかし、その解決策を試してみると、それは違いがないことが分かりました。リストは、通常のORDER BYクエリと同様に表示されました。私にとっては、solution involving regexは選択肢ではありません。自然なソートとして動作しない英数字テキストのバイナリソート
私はテーブルを作ってそれにいくつかのデータを埋めました。 SELECT name FROM test ORDER BY name ASC
を実行しているとき、私は次のような結果を得る:
見ての通りの順序が不自然です。それは1, 2, 3, 4, 5, 6, 7, 8, 9, 10
のようなものです。
私が試した解決策は、nls_sortオプションを設定することでした。
ALTER SESSION SET nls_sort='BINARY'; -- or BINARY_AI
SELECT name FROM test ORDER BY NLSSORT(name,'NLS_SORT=BINARY') -- or BINARY_AI
ASCII tableで述べたように、それは、各文字の十進コードに基づいて、リスト内のテキストを注文する必要があります。だから私はそれが正しい方法(テーブルの順序は 'スペース'、 'ドット'、数字、文字)であることを期待していましたが、何も変わっていませんでした。注文はまだ画像と同じです。それはその後、ソート順序は、各文字の数値に基づいているBINARYであるので、それはデータベースの文字に依存していた場合
設定それは私が「の文字セットとは何かを持っているかもしれません
私は使用していますが、私は何が間違っているのか分かりません。 SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET';
を実行すると私には値AL32UTF8
が与えられます。 UTF8のやや拡張されたバージョンのようです(私が間違っていれば私を修正してください)。私はOracleデータベースのバージョン11.2.0.4.0で動作しています。
だから誰でも私が間違っていることや迷っていることを教えてもらえますか?
ありがとうございます。
なぜ順序は1,2,3であるために、それは、自然である...というよりも1,10,100?文字列(文字列)を文字列で見るので、 '10'の前に' 1'を正しく置いています。 2番目の文字の値は、最初の文字のソート方法には影響しません。 'nlssort(name)'が返す文字列を見てください。なぜ正規表現はオプションではないのですか? –
ソフトウェア面では正常です。しかし、私は人間の判読可能な方法で(通常、申し訳ありませんが、それを宣言していたはずです) '普通の'ソートを意味しました。たとえば、Windowsエクスプローラを取る。そのファイルのバージョンとして機能する番号を含むファイルを並べ替えると、昇順に並べ替えるとき(または降順を使用するときは先頭に)、最も高いバージョンがリストの一番下にくることが期待されます。 –