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

时间:2019-06-11 09:05:28

标签: mysql sql

  

注意:请注意,与题为“ 类似”的问题相同(请参见下面的“我尝试过的内容”)

背景:

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

数据库列是一个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处理的输出字符串。

  • CASESIGNED / UNSIGNED无效,因为它在字符串中的任何空格处都断开了,并且也可能偏离前导零。

  • 我已阅读various MySQL Stack Overflow answers

转义条款:

如果我的查询令人困惑,则此PHP代码可能会更好地说明我正在尝试实现的目标。

  • 如果所有其他方法都失败了,我可以导出所有数字,并通过PHP循环运行它们,从而实现相同的目的:

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

2 个答案:

答案 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]*$' 在每个数字的开头和结尾以及中间。