2012-08-30 35 views
0

我有兩個數據庫,都包含電話號碼。我需要找到重複的電話號碼的所有實例,但數據庫1的格式與數據庫2的格式差異很大。使用REGEX更改mysql查詢中的字段數據

我想刪除所有非數字字符,只比較兩個10位數字字符串,以確定它是否是一個重複的,是這樣的:

SELECT b.phone as barPhone, sp.phone as SPPhone FROM bars b JOIN single_platform_bars sp ON sp.phone.REGEX = b.phone.REGEX 

是在MySQL查詢這樣的事情甚至可能嗎?如果是這樣,我該如何去做到這一點?

編輯:看起來像是,事實上,你可以做的事情!萬歲!以下查詢完全返回我需要的內容:

SELECT b.phone, b.id, sp.phone, sp.id 
FROM bars b JOIN single_platform_bars sp ON REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(b.phone,' ',''),'-',''),'(',''),')',''),'.','') = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(sp.phone,' ',''),'-',''),'(',''),')',''),'.','') 

回答

1

MySQL不支持返回正則表達式的「匹配」。 MySQL REGEXP函數返回1或0,具體取決於表達式是否匹配正則表達式測試。

您可以使用REPLACE函數來替換特定字符,並且可以嵌套這些字符。但是對於所有「非數字」字符來說這將是不便的。如果您想刪除空格,破折號,打開和關閉例如

REPLACE(REPLACE(REPLACE(REPLACE(sp.phone,' ',''),'-',''),'(',''),')','') 

一種方法是創建用戶定義的函數從字符串返回只是數字。但是,如果您不想創建用戶定義的功能...


這可以在本地MySQL中完成。這種方法有點笨拙,但適用於「合理」長度的字符串。

SELECT CONCAT(IF(SUBSTR(sp.phone,1,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,1,1),'') 
      ,IF(SUBSTR(sp.phone,2,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,2,1),'') 
      ,IF(SUBSTR(sp.phone,3,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,3,1),'') 
      ,IF(SUBSTR(sp.phone,4,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,4,1),'') 
      ,IF(SUBSTR(sp.phone,5,1) REGEXP '^[0-9]$',SUBSTR(sp.phone,5,1),'') 
     ) AS phone_digits 
    FROM sp 

要解開這一點......我們提取字符串中的第一位置的單個字符,檢查它是否是一個數字,如果它是一個數字,我們返回字符,否則就返回一個空串。我們對字符串中的第二,第三等字符重複此操作。我們將所有返回的字符和空字符串連接回單個字符串。

顯然,上面的表達式是僅檢查字符串的前5個字符,則需要擴展這個,基本上添加您要檢查每個位置的行...

而笨重表達這樣的可以包含在謂詞中(在WHERE子句中)。 (爲了方便,我剛剛在SELECT列表中顯示它。)

+0

是的,這是超級混亂,但它的工作原理!我已將我的最終代碼添加到我的上述帖子中。謝謝你的手! –

1

MySQL本身不支持這種字符串操作。您將需要使用像this這樣的UDF,或者創建一個存儲的函數,該函數對字符串參數進行迭代,並將其與每個遇到的數字的返回值連接起來。

相關問題