繁体   English   中英

MySQL 5.7仅比较混合VARCHAR列中的数字

[英]MySQL 5.7 Compare only numbers from a mixed VARCHAR column

注:请注意,这是一样的类似名称问题(请参阅“我试过”,下同)

背景:

我需要在数据库字符串列中搜索与给定搜索条件匹配的电话号码。

数据库列是一个varchar,其中包含各种用户提供的附加(即非数字)字符。

我最初的想法是使用一个系统将列字符串转换为仅数字格式(在PHP中这将通过PCRE函数),然后进行直接的缩进比较

持有的示例数据:

 id telephone: ---------------------- 1 '01576 456 567' 2 '07768345998' 3 '+447588 43 34 56' 4 '01524-901-335' 

存在各种人类可读格式,这些格式由最终用户提交并且通常是历史性的。

问题:

我找不到在此列中搜索数字的方法。 我已经将PHP中的搜索字段剥离为仅数字(0-9)。 我想尝试类似的东西:

“搜索电话栏,找到数字ONLY值(来自混合字符串)与给定搜索字符串完全匹配的位置。

(伪代码:)

  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类型函数返回true / false (0/1)而不是REGEXP处理的输出字符串。

  • CASESIGNED / UNSIGNED不起作用,因为它在字符串中的任何空格处断开,也可以丢掉前导零。

  • 我已经阅读了各种 MySQL Stack Overflow答案

逃避条款:

如果我的查询混淆了这个PHP代码可能更好地举例说明我正在努力实现的目标。

  • 如果所有其他方法都失败了,我可以导出所有数字并通过PHP循环运行它们,这将做同样的事情:

     $searchNumber = preg_replace('/[^0-9]/','',$searchNumberSource); foreach ($numberFromDb as $row){ if(preg_replace('/[^0-9]/',''.$row) === $searchNumberSource){ // Matching number is found. break; } } 

一个简单的方法是嵌套使用replace

select replace(replace(replace(telephone,' ',''), '-',''), '+','') 

您应该修复数据,使其符合您的使用方式。 这可能需要一些努力,但修复数据将简化您的代码 - 而不是艰苦的解决方案。

我的建议是在应用程序方面进行更改。 将数字更改为正则表达式:

SELECT telephone, id
FROM phones
WHERE telephone REGEXP :searchNumber_regex;

然后:searchNumber_regex '"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]*$'

基本上,模式[^0-9]*位于开头和结尾,并且位于每个数字之间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM