查找名称中包含奇数字符的记录

时间:2016-03-03 19:29:40

标签: c# sql sql-server regex sql-like

我有一个很大的记录列表,这些记录是从前一段时间不再存在的excel文档中导入的。我们已经开始发现文档中的某些名称包含必须在导入期间转换的字符。一些例子: ±©Ð€_ lÌ»ñ

我不确定可能有多少个奇怪的字符,并且有很多记录。有没有什么方法可以搜索其他字符的记录?导入是以JSON样式格式完成的,因此记录是一个长字符串,如此示例(间隔以便于查看)

{
      "email_address":"fakemail@mail.com",
      "values":{
           "FNAME":"©Johñ",
           "LNAME":"SmÌth»"
      }
}

我正在使用MSSQL Server 2008 R2,或者如果解决方案更简单,则可以执行C#。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

您可以使用like使用"而不是"和一个角色类:

select email_address
from t
where email_address like '%[^a-zA-Z0-9@.]%';

答案 1 :(得分:1)

请注意,这会在名称和电子邮件地址中找到有效的字符在您的系统中似乎无效,您应该使用以下LIKE语句:

WHERE tab.col LIKE '%[^-a-zA-Z0-9.,@:{}" _]%' COLLATE Latin1_General_100_BIN2;

这里重要的是COLLATE Latin1_General_100_BIN2(除非该字段已经在使用二进制排序规则)。但是,如果该字段未使用二进制排序规则,则不在此处为LIKE谓词指定一个将忽略ñ和其他重音字符等字符,因为它们通常等同于非重音字符(例如{ {1}} = n)。

示例:

ñ

使用SELECT col FROM (VALUES ('©Johñ'), ('{ "email_address":"fakemail@mail.com", "values":{ "LNAME":"SmÌth»" } }'), ('{ "email_address":"fakemail2@mail.com", "values":{ "LNAME":"Jones" } }'), ('{ }'), ('f_f'), ('g-g'), ('Johñ f') ) tab(col) WHERE tab.col LIKE '%[^-a-zA-Z0-9.,@:{}" _]%' COLLATE Latin1_General_100_BIN2; 子句标识COLLATE行,但没有COLLATE,该行似乎是"有效"。

或者,如果您同时拥有:

  • Unicode数据(即'Johñ f' / NVARCHAR字段)
  • 接受真实数据的系统(并且不会错误地拒绝包含非美国英文字符的姓名和电子邮件地址,或将其转换为美国英语字符)

然后T-SQL NCHAR运算符无法工作,因为跨多种语言的字母种类繁多。在这种情况下,您将需要一个正则表达式,因为它们可以处理字符类,它们是字符的逻辑分组。当然,RegEx并不是在T-SQL中本地提供的,但您仍然可以通过SQLCLR获得此功能。你可以找到很多关于如何编写代码的例子,或者你可以只下载SQL#库的免费版本(我创建的,但大多数RegEx函数 - 以及许多其他 - 都是免费的)包括 RegEx_IsMatch 函数,可以按如下方式使用:

LIKE

返回:

SELECT tab.col,
       CASE WHEN tab.col LIKE N'%[^-a-zA-Z0-9.,@:{}" _]%' COLLATE Latin1_General_100_BIN2
               THEN 1 ELSE 0 END AS [LikeOperator],
       SQL#.RegEx_IsMatch(tab.col, N'[\W-[-\{\} @:",.]]+', 1, N'IgnoreCase')
               AS [RegEx_IsMatch]
FROM (VALUES (N'©Johñ'),
             (N'{ "email_address":"fakemail@mail.com", "values":{ "LNAME":"SmÌth»" } }'),
             (N'{ "email_address":"fakemail2@mail.com", "values":{ "LNAME":"Jones" } }'),
             (N'{  }'),
             (N'f_f'),
             (N'g-g'),
             (N'k,k'),
             (N'WIDE'),
             (N'simple-email@place01.co'),
             (N'Johñ f')
     ) tab(col);

col LIKE RegEx ----------------------- ----- ------ ©Johñ 1 1 { "email_address":"fakemail@mail.com", "values":{ "LNAME":"SmÌth»" } } 1 1 { "email_address":"fakemail2@mail.com", "values":{ "LNAME":"Jones" } } 0 0 { } 0 0 f_f 0 0 g-g 0 0 k,k 0 0 WIDE 1 0 simple-email@place01.co 0 0 Johñ f 1 0 模式的含义是:一个或多个字符([\W-[-\{\} @:",.]]+)是"非字"字符([]+除了\W)以下列表没有问题:-[]-{,{{ 1}},}@:"

答案 2 :(得分:0)

此正则表达式将匹配包含' odd'的所有行。字符。您不希望被视为奇数的任何其他字符都可以添加到字符类中以从搜索中排除。

/^.*[^a-zA-Z\s\[\]\{\}'":@.,_].*$/gm