Попытка разобрать критерии поиска, такие как это будет боль. Возможным альтернативным решением было бы создание представления, которое создает длинное описание автомобиля и создание полнотекстового индекса по нему. Так что это представление может выглядеть так:
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 дверями. Кроме того, я не видел цвета в вашей схеме, поэтому я не уверен, как это попадет в микс.
Очевидно, что было бы значительно проще заставить пользователя разбить критерии поиска на составляющие части, чем пытаться реализовать поиск, подобный Google. Таким образом, вы будете ограничивать пользователя в выборе цвета из выпадающего списка, выборе марки из другого выпадающего списка и так далее. Если вы сделали это, то вам не понадобился бы вышеупомянутый View, и вы могли бы вместо этого делать запросы к столбцам в таблицах.
Кстати, столбец функций, являющийся побитовым значением, делает поиск более трудным, поскольку вам нужно будет выполнить побитовую операцию И для каждого значения, чтобы определить, имеет ли оно рассматриваемый объект. Было бы лучше разбить отображение «Характеристика на автомобиль» в отдельную таблицу.