Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Rechercher plusieurs valeurs dans la colonne xml en SQL

La première option serait d'ajouter un autre exist à la clause where.

declare @fruitId1 int;
set @fruitId1=1;

declare @fruitId2 int;
set @fruitId2=3;

select *
from @Test
where
  BasketFruits.exist('/FRUITS/FID[.=sql:variable("@fruitId1")]')=1 and
  BasketFruits.exist('/FRUITS/FID[.=sql:variable("@fruitId2")]')=1

Une autre version consisterait à utiliser les deux variables dans l'instruction xquery, en comptant les accès.

select * 
from @Test
where BasketFruits.value(
  'count(distinct-values(/FRUITS/FID[.=(sql:variable("@fruitId1"),sql:variable("@fruitId2"))]))', 'int') = 2

Les deux requêtes ci-dessus fonctionneront très bien si vous savez combien de paramètres FID vous allez utiliser lorsque vous écrivez la requête. Si vous êtes dans une situation où le nombre de FID varie, vous pouvez utiliser quelque chose comme ça à la place.

declare @FIDs xml = '<FID>1</FID><FID>3</FID>'

;with cteParam(FID) as
(
  select T.N.value('.', 'int')
  from @FIDs.nodes('FID') as T(N)
)  
select T.BasketName
from @Test as T
  cross apply T.BasketFruits.nodes('/FRUITS/FID') as F(FID)
  inner join cteParam as p
    on F.FID.value('.', 'int') = P.FID
group by T.BasketName
having count(T.BasketName) = (select count(*) from cteParam)
 

Construisez la variable @FIDs en tant que XML pour contenir les valeurs que vous souhaitez utiliser dans la requête.

Vous pouvez tester la dernière requête ici :https://data .stackexchange.com/stackoverflow/q/101600/relational-division-with-xquery