XML列的IN和NOT IN


8

我有一个带有xml列的表。Xml类似于

<Root>
  <Row>
    <user>abc</user>
    <Rowid>1</Rowid>
  </Row>
  <Row>
    <user>vf</user>
    <Rowid>2</Rowid>
  </Row>
  <Row>
    <user>ert</user>
    <Rowid>3</Rowid>
  </Row>
  <Maxrowid>3</Maxrowid>
</Root>

现在下面的查询返回sl_no列和myxmlcolumn行包含节点``user''()中具有值``abc''或``xyz''的xml列。查询以下我正在使用类似于sql的IN选项。

SELECT
    [mytable].[Sl_no],
    [mytable].[myxmlcolumn]
    FROM [mydb].dbo.[mytable]
    WHERE
        [myxmlcolumn].exist('for $x in /Root/Row where (($x/user[fn:upper-case(.)=(''ABC'',''XYZ'')])) return $x') > 0

我想要类似的查询,其功能与sql'NOT IN'相同。在我的情况下,我希望在xml列的节点“ user”()中不具有值“ abc”或“ xyz”的行。所以请帮我。

Answers:


12

存在()方法(XML数据类型)返回bit
1如果找到至少一个节点,0并且没有找到节点(空结果集)。

为了让行,其中没有ABCXYZ存在的,你只需要比较的结果exist0

[myxmlcolumn].exist('for $x in /Root/Row 
                     where (($x/user[fn:upper-case(.)=(''ABC'',''XYZ'')])) 
                     return $x') = 0

您可以使用用户节点上的谓词来重写您的FLWOR查询,

select Sl_no,
       myxmlcolumn
from mytable
where myxmlcolumn.exist('/Root/Row/user[fn:upper-case(text()[1]) = ("ABC", "XYZ")]') = 0

对于IN查询的版本,请检查是否exist返回1

select Sl_no,
       myxmlcolumn
from mytable
where myxmlcolumn.exist('/Root/Row/user[fn:upper-case(text()[1]) = ("ABC", "XYZ")]') = 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.