1

我有一个基本的“property bag”表,用于存储有关我的主表“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 子句,但我希望这次能做一些更优雅的事情。我该怎么做呢?

4

1 回答 1

4

在我看来,您在这里有一个EAV模型。如果您使用的是 sql server 2005 及更高版本,我建议您为此使用 XML 数据类型:

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

使用内置的 xml 查询功能使搜索和工作变得更加容易。

如果你不能改变你的模型,那么看看这个:

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

于 2009-01-19T18:08:17.223 回答