我有一张桌子,里面装满了任意格式的电话号码,就像这样
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'
这不是非常慢吗?
从一开始这看起来就像一个问题.你做的任何类型的搜索都需要进行表扫描,我们都知道这很糟糕.
在删除所有格式化字符后,如何添加具有当前电话号码哈希的列.然后,您至少可以索引哈希值并避免完整的表扫描.
或者数据量是否小而且预计不会增长太多?然后可能只是将所有数字吸入客户端并在那里运行搜索.