2011-12-02 71 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