2012-04-23 12 views
7

Tôi có cột loại dữ liệu XML được gọi là "thẻ" hay không.Kiểm tra xem giá trị có tồn tại trong bộ sưu tập được lưu trữ trong cột kiểu dữ liệu XML

Trong đó, tôi đang lưu trữ một bộ sưu tập, như vậy:

<ArrayOfString> 
    <string>personal</string> 
    <string>travel</string> 
    <string>gadgets</string> 
    <string>parenting</string> 
</ArrayOfString> 

Tôi muốn chọn tất cả các hàng, mà có một trong các giá trị mà tôi đang tìm kiếm: ví dụ, tôi muốn chọn tất cả các hàng trong bảng có thẻ "du lịch".

Tôi biết rằng công trình này, nếu tôi biết chỉ số giá trị Tôi đang tìm kiếm:

select * from posts 
where tags.value('(/ArrayOfString/string)[1]', 'nvarchar(1000)') = 'travel' 

nhưng truy vấn này chỉ hoạt động nếu tag "du lịch" là mục thứ 2 trong các nút. Làm cách nào để kiểm tra xem liệu giá trị có tồn tại hay không, bất kể vị trí của nó?

Trả lời

7
select * 
from tags 
where tags.exist('/ArrayOfString/string[. = "travel"]') = 1 

Hoặc như thế này nếu bạn muốn kiểm tra biến.

declare @Val varchar(10) 
set @Val = 'travel' 

select * 
from tags 
where tags.exist('/ArrayOfString/string[. = sql:variable("@Val")]') = 1 
4

Bạn có thể thử một cái gì đó như thế này:

SELECT 
    * 
FROM 
    dbo.Posts 
WHERE 
    tags.exist('/ArrayOfString/string/text()[. = "travel"]') = 1 

này sẽ liệt kê tất cả các hàng có "du lịch" tại một trong những chuỗi trong XML của bạn