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

标签 mysql sql

NOTE: Please note this is NOT the same as similarly titled questions (see "What I've Tried", below)

背景:

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

数据库列是一个带有各种用户提供的附加(即非数字)字符的 varchar。

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

持有的示例数据:

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

有多种人类可读的格式,这些格式由最终用户提交并且通常具有历史意义。

问题:

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

"Search the telephone column and find where the numeric ONLY value (from a mixed string) matches the given search string exactly.

(pseudo-code:)

   SELECT telephone, id FROM phones WHERE 
          REGEX_REPLACE(`telephone`, '[^0-9]') = :searchNumber 

(:searchNumber 是 PDO 占位符。)

示例搜索词:

"01576456567"

预期输出:

通过在 SQL 查询中输入搜索词,我希望能够检索 ID 号。在上面的搜索示例中; $result['id'] = 1;

限制:

这仅适用于 MySQL 5.7 版。我不能在这里使用 MySQL 8.0。

将电话列转换为数字列类型会导致大量次要工作,而我们现在没有时间灵 active 来执行此操作。

我尝试过的:

  • 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;
         }
    }
    

最佳答案

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

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

关于MySQL 5.7 仅比较混合 VARCHAR 列中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56540131/

相关文章:

mysql - 如何创建Mysql动态带条件查询语句

mysql - 应该使用哪种锁定方案和隔离级别来生成序列号?

c# - 在循环内添加SQL参数,在循环外执行。 (在 C# SQL 客户端中使用参数进行单查询多插入)

sql - 分组依据/不同与总和相结合?

mysql 出现 2 个内部连接路径引用相同结束位置的问题

mysql - 无法连接到我的网站上使用 wamp 创建的数据库

php - 使用 codeigniter 将今天的日期与 mysql 表中的日期进行比较

mysql - 如何使用 MySQL 按折扣列排序?

c# - 尝试将文件路径保存到数据库时出错

c# - 根据列和某个对象的字段检查 SQL 表中是否存在对象