Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Търсене на множество стойности в xml колона в SQL

Първата опция би била да добавите друга съществуваща клауза 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

Друг вариант би бил да се използват и двете променливи в оператора xquery, като се броят посещенията.

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

Двете заявки по-горе ще работят добре, ако знаете колко FID параметри ще използвате, когато пишете заявката. Ако сте в ситуация, в която броят на FID варира, можете да използвате нещо подобно вместо това.

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)
 

Създайте променливата @FIDs като XML, за да съхранявате стойностите, които искате да използвате в заявката.

Можете да тествате последната заявка тук:https://data .stackexchange.com/stackoverflow/q/101600/relational-division-with-xquery



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Необходим ли е първичен ключ в SQL Server?

  2. ODBC и SQL Server 2008:Не можете да използвате подготвени изрази?

  3. Проблем с вмъкване на паралелността - многонишкова среда

  4. Присвойте резултата от динамичния sql на променлива

  5. Условието за филтриран индекс се игнорира от оптимизатора