2017-08-30 117 views
1

這是我的表結構:從電話號碼刪除特殊字符,比較

|id |Phone_number   
|98 |+91 9033601870 
|208 |+44 6547891235 
|227 |+93 35465465 
|229 |+1 9033601870 
|259 |+1 9033601870 
|374 |+ 1 97 2- 71 4- 01 17 
|375 |+1 972-714-0117 
|376 |+92 97271 40117 
|444 |+1 888-888-8888 
|445 |+1 441-562-3124 
|446 |9727140117 

現在我想所有這一切都有數9727140117

我曾嘗試下面的事情的結果。

SELECT acp.* 
FROM `acd_contactlist_phone` acp 
WHERE acp.Phone_number like '%9727140117%'; 

此查詢結果給我錯誤。此查詢只給我最後一條記錄。

我預期的結果是:

|id |Phone_number 
|374 |+ 1 97 2- 71 4- 01 17 
|375 |+1 972-714-0117 
|376 |+92 97271 40117 
|446 |9727140117 

當前查詢的結果是:

|id |Phone_number 
|446 |9727140117 
+2

我認爲一個更好的解決方案是在插入數據庫之前清理所有數據。然後您的查詢將工作。您可以用簡單的更新清理現有的數據庫條目。 – Aknosis

回答

2

您可以使用replace()

SELECT acp.* 
FROM `acd_contactlist_phone` acp 
WHERE replace(replace(replace(acp.number, ' ', ''), '-', ''), '+', '') like '%9727140117%'; 

不幸的是,MySQL沒有正則表達式替換或者一個translate()函數。

另一種選擇將是一個複雜的正則表達式:

where acp.number regexp '9[- +]*7[- +]*2[- +]*7[- +]*1[- +]*4[- +]*0[- +]*1[- +]*1[- +]*7[- +].*' 
+0

有許多不同的特殊字符可用,如(), - ,+等,所以我必須使用替換? –

+1

@chiragsatapara。 。 。這可能是最簡單的解決方案。 –

+0

這是不可能做出一個正則表達式,這是刪除所有的特殊字符,只給數字? –

0

該查詢返回正確的,它不會考慮空間/ - 所以這將返回所有所需的結果,如果你減少通配符檢查少位數。

SELECT acp.* 
FROM `acd_contactlist_phone` acp 
WHERE acp.Phone_number like '%0117%'; 
0

隨着REGEXP操作:

SELECT acp.* 
FROM `acd_contactlist_phone` acp 
WHERE acp.Phone_number REGEXP '9[^0-9]*7[^0-9]*2[^0-9]*7[^0-9]*1[^0-9]*4[^0-9]*0[^0-9]*1[^0-9]*1[^0-9]*7'; 
+0

有沒有可能使一個正則表達式,這是刪除所有的特殊字符,並只給出像正則表達式(ACP。phone_number)像'9727140117' –

+0

@chiragsatapara,你問什麼?您的預期結果確實包含特殊字符。這個解決方案給出了預期的結果 – RomanPerekhrest

+0

是的我的預期結果包含特殊字符,但我要求刪除在哪裏條件和數量進行比較。 –

1

您可以創建一個簡單的功能,如下圖所示,從你的字符串中刪除所有特殊字符和字母。

DROP FUNCTION IF EXISTS onlynum; 
    DELIMITER | 
    CREATE FUNCTION onlynum(str CHAR(32)) RETURNS CHAR(16) 
    BEGIN 
     DECLARE i, len SMALLINT DEFAULT 1; 
     DECLARE ret CHAR(32) DEFAULT ''; 
     DECLARE c CHAR(1); 
     SET len = CHAR_LENGTH(str); 
     REPEAT 
     BEGIN 
      SET c = MID(str, i, 1); 
      IF c REGEXP '[[:digit:]]' THEN 
      SET ret=CONCAT(ret,c); 
      END IF; 
      SET i = i + 1; 
     END; 
     UNTIL i > len END REPEAT; 
     RETURN ret; 
    END | 
    DELIMITER ; 
    ; 

然後執行下面的查詢。

SELECT acp.* 
FROM `acd_contactlist_phone` acp 
WHERE onlynum(acp.number) like '%9727140117%'; 

試試上面的代碼。

+0

這個東西有可能沒有使用函數?直接使用正則表達式? –

+0

正如你必須迭代它不可能直接使用'正則表達式'。仍然@戈登是解決問題的最佳途徑。也許他可以指導我們。 –