Вопрос

У меня есть базовая таблица "пакет свойств", в которой хранятся атрибуты моей основной таблицы "Card". Поэтому, когда я хочу начать расширенный поиск карточек, я могу сделать что-то вроде этого:

SELECT dbo.Card.Id, dbo.Card.Name
  FROM dbo.Card
         INNER JOIN dbo.CardProperty ON dbo.CardProperty.IdCrd = dbo.Card.Id
 WHERE dbo.CardProperty.IdPrp = 3 AND dbo.CardProperty.Value = 'Fiend'
INTERSECT
  SELECT dbo.Card.Id, dbo.Card.Name
  FROM dbo.Card
         INNER JOIN dbo.CardProperty ON dbo.CardProperty.IdCrd = dbo.Card.Id
 WHERE (dbo.CardProperty.IdPrp = 10 AND (dbo.CardProperty.Value = 'Wind' OR dbo.CardProperty.Value = 'Fire'))

Что мне нужно сделать, так это извлечь эту идею в какую-то хранимую процедуру, чтобы в идеале я мог передать список комбинаций свойств / значений и получить результаты поиска.

Изначально это будет "строгий" поиск, означающий, что результаты должны соответствовать всем элементам запроса, но я также хотел бы иметь "свободный" запрос, чтобы он соответствовал любому из результатов в запросе.

Кажется, я никак не могу уложить это в голове.Моя предыдущая версия этого заключалась в том, чтобы сгенерировать какой-нибудь массивный SQL-запрос для выполнения с большим количеством предложений AND / OR в нем, но на этот раз я надеюсь сделать что-то более элегантное.Как мне это сделать?

Это было полезно?

Решение

мне кажется, что у вас есть Подслушивающий модель здесь.если вы используете sql server 2005 и выше, я бы посоветовал вам использовать для этого XML datatype:

http://weblogs.sqlteam.com/mladenp/archive/2006/10/14/14032.aspx

значительно упрощает поиск и прочее благодаря встроенным возможностям xml-запросов.

если вы не можете изменить свою модель, тогда посмотрите на это:

http://weblogs.sqlteam.com/davidm/articles/12117.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top