我想在MySQL数据库中搜索电话号码。
目前有这个查询:
SELECT person FROM people WHERE phone_number RLIKE '123456789'
它不会找到:
(123) 456 789
(12) 456789
123 456 789
etc etc
在我的MySQL查询中是否可以删除所有内容并留下数字?
我还想搜索删除所有空格,只留下数字和字符,同时删除所有字符,只留下数字和空格。不确定这一切是多么容易。
感谢您的帮助!
答案 0 :(得分:8)
怎么样:
SELECT
person,
replace(replace(replace(replace(phone_number,' ',''),'(',''),')',''),'-','') as phone_number
FROM
people
WHERE
phone_number RLIKE '^[+]?[-() 0-9]+$';
匹配以加号开头的数字,它们可能包含连字符,括号和空格。但除了一开始就没有加号。也没有人物。还删除了连字符,空格和括号。
答案 1 :(得分:4)
我可以想到两种方法,但不如我希望的那样优雅。
首先:在RLIKE
中使用正则表达式,允许在任何地方使用空格和括号:
SELECT person
FROM people
WHERE phone_number RLIKE '[() ]*1[() ]*2[() ]*3[() ]*4[() ]*5[() ]*6[() ]*7[() ]*8[() ]*9'
它基本上说每个数字之间可以有括号和空格。虽然制作弦乐有点尴尬。如果你用另一种语言(比如php)调用mySQL,你可以使用另一种语言将'123456789'变成'x1x2x3x4x5x6x7x8x9',其中'x'是[() ]*
。
第二:在进行比较之前使用mysql REPLACE
删除空格和括号:
SELECT person
FROM people
WHERE REPLACE(REPLACE(REPLACE(phone_number,' ',''),'(',''),')','') = '123456789';
这会依次将phone_number
中的空格,左括号和右括号替换为''。
我想我更喜欢第二种方法。要删除您需要的所有空格REPLACE(phone_number,' ','')
并删除所有()
,您需要两个REPLACE
。
我认为第一个在增加额外字符方面更灵活。遗憾的是MySQL没有启用正则表达式的REPLACE
!
答案 2 :(得分:4)
我做了一个只返回所有数字的函数.. 然后我通过
调用了函数SELECT person FROM people WHERE returnNumericOnly(phone_number) = '123456789'
我的功能是这样的:
DELIMITER $$
USE [tablename]$$
DROP FUNCTION IF EXISTS `returnNumericOnly`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `returnNumericOnly`(str VARCHAR(1000)) RETURNS VARCHAR(1000) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE counter INT DEFAULT 0;
DECLARE strLength INT DEFAULT 0;
DECLARE strChar VARCHAR(1000) DEFAULT '' ;
DECLARE retVal VARCHAR(1000) DEFAULT '';
SET strLength = LENGTH(str);
WHILE strLength > 0 DO
SET counter = counter+1;
SET strChar = SUBSTRING(str,counter,1);
IF strChar REGEXP('[0-9]+') = 1
THEN SET retVal = CONCAT(retVal,strChar);
END IF;
SET strLength = strLength -1;
SET strChar = NULL;
END WHILE;
RETURN retVal;
END $$
DELIMITER ;
答案 3 :(得分:1)
尝试像这样解决。这不好,但它会给你你想要的东西。
SELECT temp.person, p.phone_number
FROM people p
INNER JOIN (SELECT REPLACE(REPLACE(REPLACE(phone_number,' ',''),'(',''),')','') phone_number,id
FROM test) temp
ON p.id=temp.id -- primary key of the table
WHERE temp.phone_number='123456789';