Comment effectuer une recherche dans un & # 8220; Property Bag & # 8221; table en SQL?
-
19-08-2019 - |
Question
J'ai un "sac de propriétés de base" de base; table qui stocke les attributs relatifs à ma table principale " Card. " Alors, quand je veux commencer à faire des recherches avancées pour les cartes, je peux faire quelque chose comme ça:
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'))
Ce que je dois faire, c'est extraire cette idée dans une sorte de procédure stockée, afin de pouvoir idéalement passer une liste de combinaisons propriété / valeur et obtenir les résultats de la recherche.
Au départ, il s'agira d'un "strict". search signifie que les résultats doivent correspondre à tous les éléments de la requête, mais j'aimerais aussi avoir un "lâche". requête afin qu’elle corresponde à l’un des résultats de la requête.
Je n'arrive pas à comprendre ce que je pense. Ma version précédente de cela devait générer une requête SQL massive à exécuter avec beaucoup de clauses AND / OR, mais j'espère faire quelque chose d'un peu plus élégant cette fois-ci. Comment puis-je faire cela?
La solution
il me semble que vous avez ici un modèle EAV . Si vous utilisez SQL Server 2005 et plus, je vous suggère d'utiliser le type de données XML pour cela:
http://weblogs.sqlteam.com/mladenp /archive/2006/10/14/14032.aspx
facilite grandement les recherches et les recherches grâce aux fonctionnalités d'interrogation XML intégrées.
si vous ne pouvez pas changer de modèle, regardez ceci: