2009-10-12 51 views
0

我正在嘗試使用類似語句過濾SQL查詢中的結果。這裏是結果如何使用SQL LIKE

/q/my_rat_terrior_is_about_8_just_this_moring_hes_barley_moving_around_panting_heavy_and_shaking_like_shivering/1 
/addquestion 
/addquestion/Validation 
/q/how_do_you_get_a_hamster_out_of_a_wall/2 

這些是存儲在我的數據庫中的網址。我要匹配這樣的

/q/how_do_you_get_a_hamster_out_of_a_wall/2 
/q/my_rat_terrior_is_about_8_just_this_moring_hes_barley_moving_around_panting_heavy_and_shaking_like_shivering/1 

網址,這是我曾嘗試:

select * from MyURLs where MYuri LIKE '/q/' 

但它不返回任何結果。有關於此的任何想法?

回答

3

您需要使用%作爲通配符:

select * from MyURLs where MYuri LIKE '%/q/%' 

這將返回記錄以「/ Q /」在該領域的任何地方。如果你想讓它開始以「/ Q /」,但有之後的東西,你可以使用:

select * from MyURLs where MYuri LIKE '/q/%' 
+4

要小心這樣的過濾器:'「%/ Q /%」',那裏的外卡在過濾器的前面。這將打破索引。 – 2009-10-12 03:36:31

2

卡萊布已經給您的解決方案(和喬爾在評論警告有關指數的表現),但我我想提出另一條路線,那條路線可以很好地擴展。如果你的表格永遠不會變得很大,你可以忽略這個建議。事實上,你可以在你所期望的性能會受到忽視它的權利,直到時間(或性能有實際上開始痛苦) - 這是YAGNI原則。

數據庫幾乎總是閱讀遠遠超過他們寫的。這意味着,適當的時候要弄清楚當網址開頭或包含一個「/ Q /」是當數據被放入表,每一次你解壓。這會在所有讀取中分攤計算成本(在寫入時完成)。

對於這種可擴展的解決方案,您應該在表格中有一個完全獨立的列,如"startsWithQ""hasQ"

然後,用插入/更新觸發器時,將基於URL該列被放進表。

然後將查詢將變爲:

select * from MyURLs where hasQ = 'YES' 

和,只要你有對列的索引,你的查詢會尖叫一起。

如果你實際觀察一下大多數數據庫的問題,他們通常是「我的查詢速度不夠快」,而不是「我的硬盤不夠大」。以速度交易磁盤空間通常是最好的方法。

可能提供性能改進,如果您的搜索字符串是'/q/%'。這應該是異形,定期在生產 - 數據庫很少設置和忘記,因爲性能可以改變基於表中的數據 - 措施,不要猜測

它將肯定提供改進,如果搜索字符串是'%/q/%',除非你的數據庫是那些有更多的寫入速度比讀取非常罕見的野獸之一。

+1

whoa ..這是一個好主意。我將與其他解決方案一起使用此技術。但是Im實際上在做的是讀iis日誌文件,所以我會插入任何數據。但是,這是truelly其他的解決方案是一個好主意 – Luke101 2009-10-12 03:49:17

+0

是啊,這是一個非常好的主意,如果你知道你的搜索會是怎樣突前,或有追溯性地修改現有表的能力。我已經在那裏我需要尋找特定類型的審計記錄的相當多的表(通常審計數據)的工作,但我只能通過在一個varchar ......談話的開頭或中間做一個LIKE找到那些記錄關於一個緩慢的查詢! 話又說回來,這些系統得到更多的審計刀片比他們現在得到的查詢。在每天進行100,000次插入時,看看執行每次插入的LIKE的性能成本會很有趣。 – 2009-10-12 12:28:20

+1

同意,在設計數據庫創建你需要讓你永遠不要的部分結構具有使用LIKE「%sometext%」進行搜索 – HLGEM 2009-10-12 14:49:22

1

如果你有大量的文字是這樣,創建一個全文目錄,創建並填充全文索引,然後查詢全文數據。它的關鍵詞:包含,freetext,containstable,freetexttable。 sql server 2005和2008具有強大的自由文本搜索功能。