2016-03-03 63 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 
相關問題