0

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

我有这样的电话号码 (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 替换非数字值。

谢谢

4

2 回答 2

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电话号码的最大长度。

于 2013-05-15T19:10:45.707 回答
0

我不知道 mySql 正则表达式的味道,但我会试一试:

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

[^\d]+意思是:'匹配所有不是数字的东西,一次或多次'

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

于 2013-05-15T18:35:30.703 回答