这是我的表结构:
|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
答案 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';