从电话号码中删除特殊字符并比较

时间:2017-08-30 05:54:42

标签: mysql sql

这是我的表结构:

|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

4 个答案:

答案 0 :(得分: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[- +].*'

答案 1 :(得分:1)

您可以创建一个简单的函数,从String中删除所有特殊字符和字母,如下所示。

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%';

尝试以上代码。

答案 2 :(得分:0)

查询返回正确,它不会考虑空格/ - 因此如果您将通配符检查减少到更少的位数,它将返回所有必需的结果。

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

答案 3 :(得分: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';