試圖解析這樣的搜索標準將是一個痛苦。一種可能的替代解決方案是創建一個視圖,該視圖創建汽車的長描述併爲其創建全文索引。因此,這種觀點可能是這樣的:
Create View dbo.CarData
WITH SCHEMABINDING
As
Select dbo.Cars.Id
, dbo.CarMake.Manufactuer
+ ' ' + dbo.Cars.[Year]
+ Coalesce(' ' + dbo.Cars.Description,'')
+ ' ' + Case When Features & 1 <> 0 Then (Select Name From dbo.CarFeature Where Id = 1) Else '' End
+ ' ' + Case When Features & 2 <> 0 Then (Select Name From dbo.CarFeature Where Id = 2) Else '' End
+ ' ' + Case When Features & 4 <> 0 Then (Select Name From dbo.CarFeature Where Id = 4) Else '' End
+ ' ' + Case When Features & 8 <> 0 Then (Select Name From dbo.CarFeature Where Id = 8) Else '' End
+ ' ' + Case When Features & 16 <> 0 Then (Select Name From dbo.CarFeature Where Id = 16) Else '' End As Description
From dbo.Cars
Join dbo.CarMake
On CarMake.Id = Cars.MakeId
隨着該視圖一個全文索引,那麼你也許可以把你的搜索條件,並做到:
Select ...
From CarData
Where Contains(Description, Replace('red honda civic 2002 4 doors', ' ', ' AND '))
現在,這是遠遠不夠完善。例如,它將導致'... 4和門',從而在2004年找到具有2門或4WD和2門的車型。另外,我沒有在你的模式中看到顏色,所以我不確定這將如何進入混合。
顯然要強制用戶將搜索條件分解爲其組成部分顯然要簡單得多,而不是試圖實施谷歌搜索。因此,您將限制用戶從下拉列表中選擇顏色,從另一個下拉列表中選擇製作等等。如果你這樣做了,那麼你將不需要上面提到的視圖,而是可以對錶中的列進行查詢。
順便說一下,特徵列是一個按位值,因此您需要對每個值執行按位與運算,以確定它是否具有該特徵。將Feature to Car映射到單獨的表中將會更好。
@Eddit:記下標籤的變化。你寫的不是標籤如何工作。 – 2010-03-22 01:36:29
謝謝約翰 - 這裏的第一個計時器... – Eddie 2010-03-22 01:38:24