2011-12-02 70 views
-1

我试图做一个SQL Server数据库中的三字串(每个地址)和一列(“地址”)数组之间的地址匹配。例如,我在这个数组变量中有一个字符串123 main st,并且从123 main st. #A1的感兴趣列中有条目。以下是我希望我的查询或脚本执行的操作。SQL/PHP:比较地址

  • 找到这个入口123 main st. #A1
  • 找到字符串1123main任何条目,并st
  • 忽略为了
  • 忽略大小写

什么是解决这个的高效,快捷的方式问题?我以下面的方式来做这件事。这是我如何做它现在:

SELECT * 
FROM some_table 
WHERE UPPER(address) LIKE UPPER('123%') 
AND UPPER(address) LIKE UPPER('%main%') 
AND UPPER(address) LIKE '%st%';` 
+0

你的字符串的三个部分需要按顺序排列,还是应该匹配'123 st main' ... –

+0

我认为some_table可能非常大。有一件事可以帮助,就是将列地址编入索引。假设这是真的,下一步将是获得所有“像123”,然后搜索那些像%main%和%st%。 – Frank

+0

@Frank,你推荐什么样的索引来搜索'LIKE'%foo%''?那些可以[有点棘手](http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning)。 – pilcrow

回答

-1

我最终保持了我在OP中正在做的事情。它适用于我的目的。

-1

创建正则表达式匹配一个CLR函数,并在SQL Server中使用它。

0

什么是解决此问题的高效快捷方法?我

修复数据库。该设计强化了程序员的不良行为,因为数据库设计人员根本无法解决这个(复杂)问题。

WHERE UPPER(地址)LIKE UPPER( '123%')

这是 - 使用非情况sensitibve核对 - 相同解决像 '123%' 只是迫使慢表扫描。 Gratulations。

其余的一样。

基本上回到这里的数据库设计 - 你永远不会解决这个问题。一种方法是在所有数据被写入时将所有数据标准化,因此读取时不必执行复杂的查询。

+0

不幸的是,我正在查询和修改第三方程序中的数据库。我正在做的是不受程序支持的。我不愿意重组这个数据库。 – musicliftsme