当前位置:  开发笔记 > 后端 > 正文

在mysql中搜索电话号码

如何解决《在mysql中搜索电话号码》经验,为你挑选了1个好方法。

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

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'解决方案'

CONCAT和/ 的密切查询混为一谈SUBSTR

插入%针的每个字符之间(所以它是这样的:%0%7%1%2%3%4%5%6%)

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

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

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


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

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

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

这不是非常慢吗?



1> John Dyer..:

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

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

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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有