2017-08-30 52 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

正如你必须迭代它不可能直接使用'正则表达式'。仍然@戈登是解决问题的最佳途径。也许他可以指导我们。 –