查找XML是否包含然后返回一些内容

时间:2017-04-24 13:47:24

标签: sql sql-server xml

我正在尝试找到一种方法来运行查询以检查是否有任何xml文件包含某些内容,如果为true,则在该xml中返回一个不同的标记。 示例:

<shop>
   <item>
       <Product>shirt</Product>
       <color>red</color>
   </item>
   <item>
       <Product>shirt</Product>
       <color>yellow</color>
   </item>
   <item>
       <Product>jeans</Product>
       <color>blue</color>
   </item>
</shop>

假设col名称是XML,我可以找到所有衬衫的cols,我想要得到衬衫的颜色

[XML].exist ('/shop/item/Product[contains(., "shirt")]') > 0);

我希望能够得到一张桌子或一系列衬衫颜色。那可能吗? 我正在使用SQL 2012

1 个答案:

答案 0 :(得分:4)

item元素上粉碎XML,因为我们需要从每个XML中选择多个color

SELECT P.I.value('color[1]', 'varchar(100)') AS shirt_color
FROM YourTable t
CROSS APPLY t.[XML].nodes('/shop/item[contains(Product[1], "shirt")]') as P(I)

<强> rextester demo

另请注意,通过使用CROSS APPLY和XPath / XQuery,没有任何“衬衫”项的行将被过滤掉,因此我们在上面不再需要exist()