通常は「自然に」ソートする必要がある数字と文字の混合ストリングである値について、いくつかのレポートを作成する必要があります。たとえば、「P7B18」や「P12B3」など。@文字列は主に文字と数字が交互になったシーケンスです。ただし、これらのセグメントの数とそれぞれの長さは異なる場合があります。
これらの数値部分を数値順にソートしてください。明らかに、これらの文字列値をで直接処理する場合ORDER BY
、「P12B3」は「P7B18」の前に来るでしょう。 「P12」。
範囲の比較などもできるようにしたいと思い@bin < 'P13S6'
ます。浮動小数点数や負の数を処理する必要はありません。これらは厳密に私たちが扱っている負でない整数になります。文字列の長さとセグメント数は、上限が固定されていないため、潜在的に任意である可能性があります。
私たちのケースでは、文字列の大文字小文字の区別は重要ではありませんが、照合に対応した方法でこれを行う方法がある場合、他の人が便利だと思うかもしれません。これらすべての最も醜い部分は、WHERE
句で順序付けと範囲フィルタリングの両方を実行できるようにしたいです。
これをC#で実行している場合、それは非常に単純なタスクです。いくつかの解析を行ってアルファを数値から分離し、IComparableを実装すれば、基本的にはこれで完了です。もちろん、SQL Serverは、少なくとも私の知る限り、同様の機能を提供していないようです。
誰かがこれを機能させるための良いトリックを知っていますか?IComparableを実装し、これを期待どおりに動作させるカスタムCLR型を作成する、あまり公表されていない機能はありますか?私はまた、愚かなXMLトリック(「リストの連結」も参照)に反対していません。また、サーバーでCLR正規表現のマッチング/抽出/置換ラッパー関数も使用できます。
編集: もう少し詳細な例として、データがこのような動作をするようにしたいと思います。
SELECT bin FROM bins ORDER BY bin
bin
--------------------
M7R16L
P8RF6JJ
P16B5
PR7S19
PR7S19L
S2F3
S12F0
つまり、文字列をすべての文字またはすべての数字のトークンに分割し、アルファベット順または数値順に並べ替えます。左端のトークンが最も重要な並べ替え条件です。先ほど触れたように、IComparableを実装した場合の.NETの簡単な説明ですが、SQL Serverでそのようなことを行う方法(またはその方法)がわかりません。それは確かに私がこれまでに10年ほどの作業で遭遇したものではありません。
P7B12
なる可能性があるP 07 B 12
(ASCII経由)、その後、80 07 65 12
そう、80076512