如何处理MySQL查询的搜索变体?

时间:2012-10-26 02:51:47

标签: mysql

我的 PhoneNos

上有电话号码列表
ID | PhoneNo
1 | +61 2 9666 8000 

我们尝试在内容表格中搜索此手机号码(即desc字段)

挑战是实际的:

desc字段是一个文本,输入可以是任何东西,例如:

ContentID | Desc    
1 | bla bla ... +61 (02) 9666 8000 ... bla bla
2 | bla bla ... +61-2-9666-8000 bla bla
3 | bla bla ... +61 2 96668000 bla bla
4 | bla bla ... +61296668000 00116129668000 bla bla

或者可以是从额外间距排列的任何东西,例如

5 | bla bla ... +61  (02) 9666   8000 ... bla bla
6 | bla bla ... +61-2 9662 0382 ... bla bla

这是澳大利亚的电话号码,但它可能是美国或任何其他国家,因此它与一个特定的国家并不紧密。

这款手机没有任何模式,所以此前和之后的手机没有。所以它可以是任何东西。

有没有办法轻易处理这类事情?我可以构建上面的每个条件,但我只是想知道是否有更好的解决方案。

3 个答案:

答案 0 :(得分:2)

将用户输入标准化为易于搜索的格式,即“+ [x]”。如果用户输入其他空格,请将其删除。必要时添加国家/地区代码从开始删除00并用+替换。您甚至可以将电话号码拆分为三列,以便于搜索。

答案 1 :(得分:1)

为什么不从电话号码中删除特殊符号并将其存储为数字字符串?

您需要考虑的唯一情况是+,因为它取代了00。

所以基本上,你的记录只有数字,你的输入只有数字。只需确保在数据库和输入中将+标准化为正确值。

我要做的是用00而不是+来存储它们,这样当带有00的搜索输入通过时,它将起作用,以及使用+进行搜索。希望这是有道理的。

答案 2 :(得分:1)

我(高度未受过教育)的想法是使用正则表达式替换(参见here)。基本上除去数字和加号之外的所有内容(感觉笨重但是?:)),然后用相同的处理(\\+\d+,基本上)与你的控制字符串进行比较。这是一个相当广泛的假设,即不存在与您的数字匹配的另一个随机数字/字符串所产生的误报(从概率角度来看,我认为这种可能性不大)。

我正在修补我确信非常低效,不优雅且可能不正确的解决方案,并意识到它不会处理带有0内部括号的情况(因为这似乎不是出现在其他模式中)。如果你很好奇,你可以找到它here,但我认为正则表达式解决方案可能是最有效的处理方式。