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

split 和 concat 可能看起来有点奇怪,但它通常是从字符串中删除不需要的字符的最快方法。曾经有一个关于该主题的问题,但它似乎已被删除。

于 2012-05-07T11:05:13.787 回答