Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tìm kiếm nhiều giá trị trong cột xml trong SQL

Tùy chọn đầu tiên sẽ là thêm một mệnh đề where khác tồn tại.

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

Một phiên bản khác sẽ sử dụng cả hai biến trong câu lệnh xquery, đếm số lần truy cập.

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

Hai truy vấn trên sẽ hoạt động tốt nếu bạn biết bạn sẽ sử dụng bao nhiêu tham số FID khi viết truy vấn. Nếu bạn đang ở trong tình huống mà số lượng FID thay đổi, bạn có thể sử dụng một cái gì đó như thế này để thay thế.

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)
 

Xây dựng biến @FIDs dưới dạng XML để giữ các giá trị bạn muốn sử dụng trong truy vấn.

Bạn có thể kiểm tra truy vấn cuối cùng tại đây: https:// data .stackexchange.com / stackoverflow / q / 101600 / relational-split-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. Sử dụng dạng xem SQL từ mã khung thực thể Phiên bản đầu tiên 5

  2. Chèn dữ liệu SQL Server vào Salesforce.com

  3. SQL Server:Mẹo hữu ích cho người mới

  4. Làm cách nào để truy xuất một bảng từ thủ tục được lưu trữ đến một cơ sở dữ liệu?

  5. Khái niệm cơ bản về tự động hóa tác vụ SQL Server