MySQL REGEXP - 删除空格和非数字字符

时间:2012-01-13 01:41:00

标签: mysql

我想在MySQL数据库中搜索电话号码。

目前有这个查询:

SELECT person FROM people WHERE phone_number RLIKE '123456789'

它不会找到:

(123) 456 789
(12) 456789
123 456 789
etc etc

在我的MySQL查询中是否可以删除所有内容并留下数字?

我还想搜索删除所有空格,只留下数字和字符,同时删除所有字符,只留下数字和空格。不确定这一切是多么容易。

感谢您的帮助!

4 个答案:

答案 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';