2016-03-03 62 views
2

我有一段很长时间以前从excel文档中导入的记录不再存在的大量记录。我们已经开始发现文档中的一些名称中有一些字符必须在导入过程中被转换。一些例子: ±©Ùl l在名称中查找包含奇数字符的记录

我不确定可能有多少奇数字符,并且有很多记录。有没有什么办法可以对这些其他人物的记录进行搜索?进口是在一个JSON样式的格式完成的,所以记录是一长串这样的例子

{ 
     "email_address":"[email protected]", 
     "values":{ 
      "FNAME":"©Johñ", 
      "LNAME":"SmÌth»" 
     } 
} 

我使用的是MSSQL Server 2008 R2中,还是能做到的C#如果解决方案(间隔以方便查看)这样更简单。任何帮助表示赞赏。

+0

“奇怪”是什么意思? “ñ”和“Ù”以及“Ì”对于名称来说是完全有效的字符,并且这些日子在域名中也是有效的。 –

+0

在我的情况下,当这个JSON稍后被其他代码使用时,它们不被接受为有效字符,这使得它们对我来说是“奇怪的”。 – Blankdud

+0

即使他们自然是某人名字的一部分?或者一个域名,在这种情况下,将其改为删除口音在技术上不会是相同的域名,因此不会是他们的电子邮件地址? –

回答

1

需要提醒的是,这将发现,在两种姓名和电子邮件地址有效字符似乎并不在你的系统有效的,你应该使用下列LIKE声明:

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

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

实施例:

SELECT col 
FROM (VALUES ('©Johñ'), 
      ('{ "email_address":"[email protected]", "values":{ "LNAME":"SmÌth»" } }'), 
      ('{ "email_address":"[email protected]", "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子句'Johñ f'行被识别,但没有COLLATE,该行显示为 “有效”。


另外,如果你有两个:

  • Unicode数据(即NVARCHAR/NCHAR场)
  • 接受现实世界的数据(而不会错误地拒绝姓名和电子邮件地址的系统包含非美国英文字符,或将它们转换为美国英语等效字符)

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

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":"[email protected]", "values":{ "LNAME":"SmÌth»" } }'), 
      (N'{ "email_address":"[email protected]", "values":{ "LNAME":"Jones" } }'), 
      (N'{ }'), 
      (N'f_f'), 
      (N'g-g'), 
      (N'k,k'), 
      (N'WIDE'), 
      (N'[email protected]'), 
      (N'Johñ f') 
    ) tab(col); 

返回:

col                   LIKE RegEx 
-----------------------              ----- ------ 
©Johñ                   1  1 
{ "email_address":"[email protected]", "values":{ "LNAME":"SmÌth»" } }   1  1 
{ "email_address":"[email protected]", "values":{ "LNAME":"Jones" } }   0  0 
{ }                   0  0 
f_f                    0  0 
g-g                    0  0 
k,k                    0  0 
WIDE                   1  0 
[email protected]               0  0 
Johñ f                   1  0 

什么[\W-[-\{\} @:",.]]+图案的意思是:一个或多个字符([]+),这些 “非字” 字符(\W除了-[])以下列表,其是确定:-{}@:",,和.

+0

这很棒。非常感谢srutzky的帮助! – Blankdud

+0

@Blankdud没问题。如果您或任何人需要考虑真实世界的数据,我添加了一个通过RegEx处理它的部分:-)。 –

1

你可以找到使用like意外的字符与“不是”和字符类:

select email_address 
from t 
where email_address like '%[^[email protected]]%'; 
+0

我试过这个:'%[^ a-zA-Z0-9 @。{“:,} _]%'并且收到了所有记录 是否需要转义{”:,}这样的JSON字符?或者我可以把它们放在大括号里面? – Blankdud

+0

如果你想忽略它们,然后把它们放在方括号之间。请记住,用插入符号(''^'')开始列表意味着“与此字符不匹配”。 –

0

此正则表达式将匹配包含一个“奇”字行。您不希望被视为奇怪的任何其他字符可以添加到字符类中以从搜索中排除。

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