2012-05-07 3 views
0

文字列とユーザーが挿入した値を比較する必要があるという問題があります。文字列を比較する方法障害のない列インデックス

カラムの値は、次のいずれかの形式で指定できます。文字列は、問題は、我々が持っているデータは非常に多くのフォーマットが含まれていると私はいずれかを使用することができないことを照会しながら、私はいくつかの制限を持っているとして、我々はすべてのSQLServerで比較しながら、扱うことができないということである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 

することはできませんスカラー関数はwhere句ではインデックスやその他のパフォーマンスを妨げます。

私が持つ唯一の選択肢は、C#コードで処理することです。

上記のすべてのケースとそれ以外の可能性のあるすべてのケースを処理するC#のジェネリック関数を手伝ってくれますか?

+0

データの長さは任意ですか?スペース、かっこ、ダッシュは重要ですか? – ChrisF

+0

既存の回答は両方とも正しい(そして同じ)。 –

答えて

2

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

ユーザーが新しい入力を入力して正規化し、照会を使用してデータベースの正規化された値と比較すると、

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

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(); 
    } 
} 

を無視することができ、分割及び連結は少し奇妙に思えるかもしれないが、それは通常、不要な文字を削除する最速の方法です - 「(」、「)」、」 'と』と仮定すると

1

データは電話番号のように見えます。その場合、スペース、かっこ、およびダッシュは重要ではありません。だからあなたはそれらを取り除き、数字だけで構成される文字列を残すことができます。

この正規化されたフォームをはるかに簡単に比較できるはずです。

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

0

文字列。以前はそのトピックに関する質問がありましたが、削除されているようです。