首页 > 解决方案 > 如何使用通配符根据 XML 列的内容进行选择

问题描述

我尝试从依赖于 XML 列内容的表中检索所有行。加上内容对应于模式的事实。

我的桌子的布局可能看起来像这样:

|Id |Name|Designation|XML             |
| 1 |Abc |Ghi        |...|
| 2 |Def |Jkl        |...|

假设 XML 列的内容可能是这样的:

<Root>
  <Node1>
    <SubNode1 />
    <SubNode2 />
  </Node1>
  <Node2>
    <SubNode3 property="Something">
      ...
    </SubNode3>
    <SubNode3 property="Reference.Object(abcdef12345 (1)).Value">
      ...
    </SubNode3>
    <SubNode3 property="SomethingElse">
      ...
    </SubNode3>
  </Node2>
</Root>

现在,前面的 XML 是 XML 列的内容,但我们要查找的属性可能在第一个或第三个 SubNode3 中。目标是获取包含节点/Root/Node2/SubNode3/@property 的所有行,其中包含“Reference.Object(ab* (1))。但 () 之间的数字可能是另一个。这里是 1,但它可以是另一个数字。我写 * 表示文本可以是其他任何内容,但以“ab”开头。

我尝试过的(除其他外......)是这样的:

WITH XMLNAMESPACES(DEFAULT 'http://schemas.mycompany.com/validation.xsd')
SELECT *
from [MySchema].[MyTable]
where XML.exist('/Root/Node2/SubNode3/@property[contains(.,"Reference.Object") and contains(.,("(1)"))]') = 1;

但这里的问题是,我不知道怎么说在 (1) 中,1 可能是另一个数字,并且属性属性中第一个括号之间的字符串以“ab”开头,并且可以包含任何内容。

我也尝试使用 xquery.value 来使用 LIKE 语法,但问题是(也许我错过了一些东西)值使用特定节点,我的意思是索引到 [1],所以它在第一个 SubNode3 上搜索而不是其他。

标签: sql-serverxquerywildcard

解决方案


推荐阅读