DB側のページネーションを持つ大規模なデータベースがあります。これは迅速で、数百万のレコードからわずか 1 秒で 50 行のページを返します。
ユーザーは、基本的にソートする列を選択して、独自のソートを定義できます。列は動的です - 数値、日付、テキストを持つものがあります。
ほとんどの場合、テキストは期待どおりにソートされますが、愚かな方法でソートされます。それはコンピューターにとっては理にかなっていますが、ユーザーを苛立たせます。
たとえば、文字列レコード ID で並べ替えると、次のようになります。
rec1
rec10
rec14
rec2
rec20
rec3
rec4
...等々。
これに番号を考慮してもらいたいので、次のようにします。
rec1
rec2
rec3
rec4
rec10
rec14
rec20
入力を制御できず (そうでなければ先頭の 000 でフォーマットするだけです)、単一のフォーマットに頼ることもできません - いくつかは "{alpha code}-{dept code}-{rec id}" のようなものです。
C# でこれを行ういくつかの方法を知っていますが、すべてのレコードをプルダウンしてソートすることはできません。
Sqlサーバーで自然な並べ替えをすばやく適用する方法を知っている人はいますか?
私たちは使用しています:
ROW_NUMBER() over (order by {field name} asc)
そして、それによってページングしています。
トリガーを追加することはできますが、追加することはできません。彼らの入力はすべてパラメータ化されていますが、形式を変更することはできません.「rec2」と「rec10」を入力すると、そのように自然な順序で返されることを期待しています.
クライアントごとに異なる形式に従う有効なユーザー入力があります。
rec1、rec2、rec3、... rec100、rec101
別の可能性があります: grp1rec1、grp1rec2、... grp20rec300、grp20rec301
入力を制御できないというのは、ユーザーにこれらの標準を変更するよう強制できないという意味です。これらの標準には grp1rec1 のような値があり、それを grp01rec001 として再フォーマットすることはできません。外部システムへのリンク。
これらの形式はさまざまですが、多くの場合、文字と数字が混在しています。
これらを C# で並べ替えるのは簡単です。それを分割して{ "grp", 20, "rec", 301 }
、シーケンス値を順番に比較するだけです。
ただし、何百万ものレコードがあり、データがページングされている可能性があるため、SQL サーバーで並べ替えを行う必要があります。
SQLサーバーは比較ではなく値でソートします-C#では値を分割して比較できますが、SQLでは一貫してソートする単一の値を(非常に迅速に)取得するロジックが必要です。
@moebius - あなたの答えはうまくいくかもしれませんが、これらすべてのテキスト値にソートキーを追加するのは醜い妥協のように感じます.