在mysql中搜索电话号码

Ori*_*rds 11 mysql string search phone-number

我有一张桌子,里面装满了任意格式的电话号码,就像这样

027 123 5644
021 393-5593
(07) 123 456
042123456
Run Code Online (Sandbox Code Playgroud)

我需要以类似的任意格式搜索电话号码(例如,07123456应该找到条目(07) 123 456

我用普通编程语言执行此操作的方法是将所有非数字字符从"针"中删除,然后遍历大海捞针中的每个数字,从中删除所有非数字字符,然后进行比较针,例如(在红宝石中)

digits_only = lambda{ |n| n.gsub /[^\d]/, '' }

needle = digits_only[input_phone_number]
haystack.map(&digits_only).include?(needle)
Run Code Online (Sandbox Code Playgroud)

问题是,我需要在MySQL中执行此操作.它有许多字符串函数,其中没有一个看起来像我想要的那样.

目前我可以想到2'解决方案'

  • CONCAT和/ 的密切查询混为一谈SUBSTR
  • 插入%针的每个字符之间(所以它是这样的:%0%7%1%2%3%4%5%6%)

然而,这些似乎都不是特别优雅的解决方案.
希望有人可以提供帮助,或者我可能会被迫使用%%%%%%解决方案

更新:这是在相对固定的数据集上运行,可能有几百行.我只是不想做一些非常糟糕的事情,未来的程序员会哭泣.

如果数据集增长,我将采用'phoneStripped'方法.感谢您的所有反馈!


你可以使用"替换"功能去掉任何"("," - "和""的实例,

我并不担心结果是数字的.我需要考虑的主要特点是+,-,(,)space 因此将是解决这个样子?

SELECT * FROM people 
WHERE 
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '('),')'),'-'),' '),'+')
LIKE '123456'
Run Code Online (Sandbox Code Playgroud)

这不是非常慢吗?

Joh*_*yer 11

从一开始这看起来就像一个问题.你做的任何类型的搜索都需要进行表扫描,我们都知道这很糟糕.

在删除所有格式化字符后,如何添加具有当前电话号码哈希的列.然后,您至少可以索引哈希值并避免完整的表扫描.

或者数据量是否小而且预计不会增长太多?然后可能只是将所有数字吸入客户端并在那里运行搜索.


小智 5

我知道这是古老的历史,但我在寻找类似的解决方案时发现了它。

一个简单的 REGEXP 可能会起作用:

select * from phone_table where phone1 REGEXP "07[^0-9]*123[^0-9]*456"
Run Code Online (Sandbox Code Playgroud)

这将匹配phonenumber带有或不带有任何分隔字符的列。