在mysql中搜索电话号码

我有一个包含任意格式的电话号码的表格,例如这个

027 123 5644
021 393-5593
(07) 123 456
042123456

我需要以类似的近似格式查找电话号码(例如 07123456 应该发现访问 (07) 123 456

我肯定会用普通的编程语言做到这一点的方法是从“针”中去掉所有非数字字符,然后遍历大海捞针中的每个数字,去掉所有非数字字符,然后对比对着针,例如(红宝石)

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

needle = digits_only[input_phone_number]
haystack.map(&digits_only).include?(needle)

问题是,我需要在 MySQL 中执行此操作。 它有许多字符串功能,但似乎没有一个真正符合我的要求。

目前我可以想到2个“服务”

  • 拼凑一个弗兰肯 - 对 CONCATSUBSTR 的查询
  • 在针的每个个性之间插入一个 %(所以它是这样的:%0%7%1%2%3%4%5%6%

但是,这些看起来都不是特别时尚的解决方案。¢ 希望有人可以提供帮助,否则我可能会被迫使用 %%%%%% 补救措施

更新:这是在一组相对处理过的数据上运行的,可能有几百行。 我只是不打算做一些未来设计师会哭泣的极其糟糕的事情。

如果数据集扩展,我将采用“phoneStripped”策略。 感谢所有的反馈!


您能否使用“替换”功能来去除“(”,“ - ”以及“”的任何情况,

我不担心结果是数字的。 我需要考虑的主要人物是 +-()space 那么这个解决方案肯定会像这样吗?

SELECT * FROM people 
WHERE 
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phonenumber, '('),')'),'-'),' '),'+')
LIKE '123456'

那岂不是大大减少了?

17
2022-06-07 14:37:26
资源 分享
答案: 9

我的选择与约翰·戴尔所声称的类似。 我将添加第二列(例如phoneStripped),它在插入时获得剥离并更新。 索引此列并对其进行搜索(显然是在删除搜索词之后)。

您也可以添加一个触发器来立即更新该列,尽管我没有处理触发器。 但是就像您声称的那样,编写 MySQL 代码来剥离字符串确实很困难,因此仅在您的客户端代码中执行它可能不那么复杂。

(我知道这已经晚了,但是我只是在这里开始浏览

2
2022-07-02 20:27:04
资源

如果这是经常发生的事情,也许将信息更改为一种样式,然后安排搜索类型以去除任何非字母数字(如果您允许像 310 - BELL 这样的数字)肯定是一个很棒的概念。 以方便的格式获取数据是成功的一半。

0
2022-06-07 16:29:00
资源

这似乎从一开始就是一个问题。 您进行的任何类型的浏览都肯定需要进行表扫描,而且我们大多数人都知道这是不好的。

在删除所有格式字符后,如何包含一个包含当前电话号码哈希的列。 之后,您至少可以索引散列值并远离完整的吹表检查。

还是信息量很小,也不会增长太多? 之后,也许只需将所有数字直接输入客户并在那里进行搜索。

15
2022-06-07 16:27:32
资源

一个开箱即用的建议,但是您可以使用“替换”功能来删除“(”,“ - ”和“”的任何情况,然后使用“isnumeric”功能来检查结果字符串是否为数字?

然后,您可以对要查找的电话号码字符串执行相同的操作,并将它们作为整数进行对比。

当然,这不会有利于像 1800 - MATT - ROCKS 这样的数字。

2
2022-06-07 15:04:50
资源

是否可以运行一个问题来重新格式化数据以匹配所需的布局,然后简单地运行一个简单的问题? 这样,即使最初的重新格式化很慢,您也不会真正发出问题。

2
2022-06-07 15:04:25
资源

MySQL 可以根据正则表达式进行搜索。

当然,但提供了近似的格式,如果我的 haystack 包含 "(027) 123 456"(请记住房间的位置可以改变,它同样可以很容易地成为 027 12 3456 并且我希望将它与 027123456 匹配,因此我的正则表达式肯定需要这样?

"^[\D]+0[\D]+2[\D]+7[\D]+1[\D]+2[\D]+3[\D]+4[\D]+5[\D]+6$"

(事实上​​它会更糟,因为 mysql 指南似乎没有显示它支持 \D

如果是这样的话,是不是和我的%%%%%建议差不多?

0
2022-06-07 15:04:17
资源

只是一个概念,但是您不能使用正则表达式快速删除字符,然后像@Matt Hamilton 建议的那样与之形成对比吗?

甚至可能设置一个视图(不完全确定显示的 mysql)肯定会将所有被正则表达式删除的联系号码保留为普通电话号码?

0
2022-06-07 15:04:07
资源

祸是我。 我最终这样做了:

mre = mobile_number && ('%' + mobile_number.gsub(/\D/, '').scan(/./m).join('%'))

find(:first, :conditions => ['trim(mobile_phone) like ?', mre])
0
2022-06-07 15:03:42
资源

这是 MySQL 的一个问题——regex 函数可以匹配,但不能替换。 看到这个帖子 以获得可能的补救措施。

2
2022-06-07 15:02:41
资源