如何从字符串MySQL中替换非数字字符

时间:2013-05-15 18:17:48

标签: mysql regex replace

我需要一种更好的方法来替换字符串中的非数字字符。

我有这样的电话号码 (888)488-6655 888-555-8888 blah blah blah

所以我能够通过使用简单的替换函数返回一个干净的字符串,但我正在寻找一种更好的方法可能是使用表达式函数来替换任何非数字值。像空格斜线,反斜杠,引用.....任何无数值

这是我当前的查询

SELECT
a.account_id,
REPLACE(REPLACE(REPLACE(REPLACE(t.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS contact_number,
IFNULL(t.ext, '') AS extention,
CASE WHEN EXISTS (SELECT number_id FROM contact_numbers WHERE main_number = 1 AND account_id = a.account_id) THEN 0 ELSE 1 END AS main_number,
'2' AS created_by
FROM cvsnumbers t
INNER JOIN accounts a ON a.company_code = t.company_code
WHERE REPLACE(REPLACE(REPLACE(REPLACE(t.phone_number, '-', ''), ' ', ''), ')', ''),'(','')  NOT IN(SELECT contact_number FROM contact_numbers WHERE account_id = a.account_id)
AND LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(t.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10

如何更改查询以使用REGEX替换非数字值。

由于

2 个答案:

答案 0 :(得分:1)

这是一种蛮力方法。

这个想法是创建一个数字表,它将索引电话号码中的每个数字。保留数字(如果是数字)然后将它们组合在一起。以下是它的工作原理:

select t.phone_number,
       group_concat(SUBSTRING(t.phone_number, n.n, 1) separator '' order by n
                   ) as NumbersOnly
from cvsnumbers t cross join
     (select 1 as n union all select 2 union all select 3
     ) n
where SUBSTRING(t.phone_number, n.n, 1) between '0' and '9'
group by t.phone_number;

此示例仅查看数字中的前3位数字。您可以将n的子查询扩展为电话号码的最大长度。

答案 1 :(得分:0)

我不知道mySql正则表达式的味道,但我会给它一个去:

REPLACE(t.phone_number, '[^\d]+', '')

[^\d]+表示:'匹配所有不是数字的内容,一次或多次'

您可能需要转义反斜杠([^\\d]+)。