如何在不干扰索引的情况下比较字符串列

时间:2012-05-07 10:39:37

标签: c# .net sql

我遇到了一个问题,我必须将字符串列与用户插入的任何值进行比较。

列中的值可以采用以下任何格式;和字符串不能超过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#中创建一个通用函数来处理上面提到的所有情况以及其他可能的情况吗?

3 个答案:

答案 0 :(得分:2)

我建议添加包含格式化值的规范化值的新列。标准化值只是原始值,没有不重要的字符(空格,括号等)

当用户提供新输入时,将其标准化并使用查询将其与数据库中的规范化值进行比较。

将数据保存到数据库时,请同时保存原始值和标准化值。

答案 1 :(得分:1)

数据看起来可能是电话号码。如果是这种情况,则空格,括号和短划线不重要。所以你可以将它们剥离出来并留下仅由数字组成的字符串。

您应该能够更轻松地比较这种规范化形式。

如果保留用户输入的格式很重要,请将规范化表单作为单独的列存储在数据库中。

答案 2 :(得分: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();
     }
}
分裂和连接可能看起来有点奇怪,但它通常是从字符串中删除不需要的字符的最快方法。曾经有一个关于该主题的问题,但它似乎已被删除。