0

文字列列をユーザーが挿入した値と比較する必要があるという問題があります。

列の値は、次のいずれかの形式にすることができます。文字列は 19 文字を超えることはできません

00000000000
(000) 000-0000
000-000-0000
22222222222222
000 000 00000
000 000 0000
000-000-0000
000-000-00000
00 00 000 0000
000000000000
0000 0000 000

問題は、私たちが持っているデータには非常に多くの形式が含まれており、sqlserver での比較中にすべてを処理できないことです。これは、インデックスやパフォーマンスを乱すため、WHERE 句でスカラー関数を使用できないという制限があるためです。

私が持っている唯一のオプションは、C# コードで処理することです。

上記のすべてのケースと可能なその他のケースを処理するC#で汎用関数を作成する際に、誰かが私を助けて案内してくれますか?

4

3 に答える 3

2

フォーマットされた値の正規化された値を含む新しい列を追加することをお勧めします。正規化された値は、重要でない文字 (スペース、括弧など) を除いた元の値です。

ユーザーが新しい入力を提供すると、それを正規化し、クエリを使用してデータベース内の正規化された値と比較します。

データをデータベースに保存するときは、元の値と正規化された値の両方を保存します。

于 2012-05-07T11:00:23.050 に答える
1

データは電話番号のようです。その場合、スペース、括弧、およびダッシュは重要ではありません。そのため、それらを取り除いて、数字だけで構成された文字列が残る可能性があります。

この正規化された形式をはるかに簡単に比較できるはずです。

ユーザーが入力した形式を保持することが重要な場合は、正規化されたフォームを別の列としてデータベースに保存します。

于 2012-05-07T10:58:46.513 に答える
0

「(」、「)」、「」、および「-」は無視できると仮定すると、

public class ColumnComparer : IEqualityComparer<string> {
     private static readonly string[] remove = {"(",")"," ","-"};
     public bool Equal(string x, string y){
          //remove ignorable characters;
          var tempX = string.Concat(x.Split(remove,StringSplitOptions.IgnoreEmptyEntries));
          var tempY = string.Concat(y.Split(remove,StringSplitOptions.IgnoreEmptyEntries));
          return tempX == tempY;
     }

     public int GetHashCode(string x){
          return string.Concat(
               x.Split(remove,StringSplitOptions.IgnoreEmptyEntries)
               ).GetHashCode();
     }
}

分割と連結は少し奇妙に思えるかもしれませんが、通常、文字列から不要な文字を削除する最も速い方法です。まさにそのトピックに関する質問がありましたが、削除されたようです。

于 2012-05-07T11:05:13.787 に答える