Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cari beberapa nilai dalam kolom xml di SQL

Opsi pertama adalah menambahkan klausa where yang lain.

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

Versi lain adalah menggunakan kedua variabel dalam pernyataan xquery, menghitung klik.

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

Dua kueri di atas akan berfungsi dengan baik jika Anda tahu berapa banyak parameter FID yang akan Anda gunakan saat menulis kueri. Jika Anda berada dalam situasi di mana jumlah FID bervariasi, Anda dapat menggunakan sesuatu seperti ini sebagai gantinya.

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)
 

Buat variabel @FIDs sebagai XML untuk menampung nilai yang ingin Anda gunakan dalam kueri.

Anda dapat menguji kueri terakhir di sini: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. Rekayasa Terbalik untuk Pembuatan Diagram Basis Data di Visio dengan SQL Server 2008

  2. Bisakah Gabung antara tampilan dan tabel merusak kinerja?

  3. Penyembunyian Data Dinamis di SQL Server untuk Pengguna Tingkat Lanjut

  4. Kasus dalam Pernyataan Pilihan

  5. Panggil prosedur tersimpan dengan parameter bernilai tabel dari Java