注意:请注意,与题为“ 类似”的问题不相同(请参见下面的“我尝试过的内容”)
我需要在数据库字符串列中搜索与给定搜索条件匹配的电话号码。
数据库列是一个varchar,其中包含用户提供的各种其他(非数字)字符。
我最初的想法是使用系统将列字符串转换为仅数字格式(在PHP中,这将通过PCRE函数),然后进行直接相同的比较
id telephone: ---------------------- 1 '01576 456 567' 2 '07768345998' 3 '+447588 43 34 56' 4 '01524-901-335'
拥有多种人类可读格式,这些格式是由最终用户提交的,通常具有历史意义。
我找不到在此列中搜索数字的方法。我已将PHP中的搜索字段简化为仅数字(0-9)。我想尝试类似的东西:
“搜索“电话”列,并找到仅数字值(来自混合字符串)与给定搜索字符串完全匹配的地方。
(伪代码:)
SELECT telephone, id FROM phones WHERE REGEX_REPLACE(`telephone`, '[^0-9]') = :searchNumber
(:: searchNumber是PDO占位符。)
“ 01576456567”
通过将搜索词输入SQL查询,我希望能够检索ID号。在上面的搜索示例中; $result['id'] = 1;
这仅在MySQL vesion 5.7上。我不能在这里使用MySQL 8.0。
将电话列转换为数字列类型将花费大量时间,我们现在没有足够的时间灵活地执行此操作。
MYSQL上的REGEXP type functions返回true
/ false
(0/1),而不是REGEXP处理的输出字符串。
CASE
到SIGNED
/ UNSIGNED
无效,因为它在字符串中的任何空格处都断开了,并且也可能偏离前导零。
如果我的查询令人困惑,则此PHP代码可能会更好地说明我正在尝试实现的目标。
如果所有其他方法都失败了,我可以导出所有数字,并通过PHP循环运行它们,从而实现相同的目的:
$searchNumber = preg_replace('/[^0-9]/','',$searchNumberSource);
foreach ($numberFromDb as $row){
if(preg_replace('/[^0-9]/',''.$row) === $searchNumberSource){
// Matching number is found.
break;
}
}
答案 0 :(得分:2)
一种简单的方法是嵌套使用replace
select replace(replace(replace(telephone,' ',''), '-',''), '+','')
答案 1 :(得分:1)
您应该修复数据,使其与您要使用的数据匹配。现在可能需要花费一些精力,但是修复数据将简化您的代码进行中-而不是繁琐的工作。
我的建议是在应用程序端进行更改。将数字更改为正则表达式:
SELECT telephone, id
FROM phones
WHERE telephone REGEXP :searchNumber_regex;
然后:searchNumber_regex
的{{1}}如下:
'"01576456567'
基本上,模式'^[^0-9]*0[^0-9]*1[^0-9]*5[^0-9]*7[^0-9]*6[^0-9]*4[^0-9]*5[^0-9]*6[^0-9]*5[^0-9]*6[^0-9]*7[^0-9]*$'
在每个数字的开头和结尾以及中间。