sql >> Base de Datos >  >> RDS >> Sqlserver

Busque múltiples valores en la columna xml en SQL

La primera opción sería agregar otra cláusula 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

Otra versión sería usar ambas variables en la sentencia xquery, contando los hits.

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

Las dos consultas anteriores funcionarán bien si sabe cuántos parámetros FID utilizará cuando escriba la consulta. Si se encuentra en una situación en la que la cantidad de FID varía, puede usar algo como esto.

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)
 

Cree la variable @FIDs como un XML para contener los valores que desea usar en la consulta.

Puede probar la última consulta aquí:https://data .stackexchange.com/stackoverflow/q/101600/división-relacional-con-xquery