当前位置: 首页 > 面试题库 >

XQuery:查找包含指定的xml数据的行

堵凯
2023-03-14
问题内容

我有一个包含许多行的表,每个行都有一个名为“ RecordData”的列,其中包含我要搜索的XML数据。

下面给出了此列中三行示例xml数据的值:

1:

<Record>
  <RecordField ID="31" Name="Barcode1" DataTypeId="5" TypeName="String" Decimals="0" Format="" Mandatory="False">ABC123</RecordField>
</Record>

2:

<Record>
  <RecordField ID="15" Name="Field 1" DataTypeId="7" TypeName="Boolean" Decimals="0" Format="" Mandatory="False">true</RecordField>
  <RecordField ID="16" Name="Field 2" DataTypeId="5" TypeName="String" Decimals="0" Format="" Mandatory="False">purpke</RecordField>
</Record>

3:

<Record>
  <RecordField ID="15" Name="Field 1" DataTypeId="7" TypeName="Boolean" Decimals="0" Format="" Mandatory="False">true</RecordField>
  <RecordField ID="16" Name="Field 2" DataTypeId="5" TypeName="String" Decimals="0" Format="" Mandatory="False">12</RecordField>
</Record>

我正在使用以下SQL尝试查找任何表行,这些表行的XML数据包含特定的搜索词(在本示例中为‘1’)。

DECLARE @SearchTerm varchar(max)
    SET @SearchTerm = '1'
    SELECT * 
    FROM MyTableOfData
    WHERE RecordFields.value('contains( (/Record/RecordField/text())[1],sql:variable("@SearchTerm"))','bit') = 1

正如您将看到的,这依赖于出现在第一个“ RecordField”元素文本中的搜索词,而不是在所有“
RecordField”节点上进行搜索。意思是,我得到的唯一结果将是第1行,而不是第1行和第3行。

我已经阅读了有关MSDN的相关文章,并度过了Google失败的一天,因为我离寻找消除限制并最终破解它的距离越来越近了。

任何帮助将不胜感激 :)

编辑:

DECLARE @SearchTerm varchar(max)
SET @SearchTerm = '1'
select *
from MyTableOfData
    cross apply MyTableOfData.RecordFields.nodes('/Record/RecordField') as tx(r)
where  tx.r.value('.','varchar(10)') like '%'+@searchterm+'%'

抛出:

Msg 493, Level 16, State 1, Line 3
The column 'r' that was returned from the nodes() method cannot be used directly. It can only be used with one of the four XML data type methods, exist(), nodes(), query(), and value(), or in IS NULL and IS NOT NULL checks.

编辑2:

当您准确复制所告知的内容时,它不会丢失任何东西,而是有效的!

DECLARE @SearchTerm varchar(max)
SET @SearchTerm = '1'
select MyTableOfData.*
from MyTableOfData
    cross apply MyTableOfData.RecordFields.nodes('/Record/RecordField') as tx(r)
where  tx.r.value('.','varchar(10)') like '%'+@searchterm+'%'

问题答案:

CROSS APPLY 是您找不到的东西…

select yourtable.*
from yourtable
    cross apply yourtable.RecordFields.nodes('/Record/RecordField') as tx(r)
where  tx.r.value('.','varchar(10)') like '%'+@searchterm+'%'

或者

where tx.r.value('contains((.),sql:variable("@searchterm"))','bit')=1


 类似资料:
  • 如何返回特定日期所在的行号? 类似这样的事情:

  • 我有一个这样的csv文件: 我必须按“姓名”和“出生日期”(可能与其他列一起)查找唯一的行,但必须按最大日期查找。 因此,我必须获得如下csv文件: 怎么做?我没有任何想法。。

  • 问题内容: 我有以下模型: 我正在寻找一个查询,该查询检索不属于某个特定组的所有人员(即,人员的组数组不包含指定组的ID)。 我在考虑这样的事情,但是我不确定它是正确的: 问题答案: 基本的尝试没什么错,但是这里唯一的澄清可能是普遍的误解,即您需要像 或 查询数组时这样的运算符。 另外,您真的需要在这里做一个基本的不等式匹配 : “数组”运算符不用于“数组目标”,而是用于提供条件的“列表”以方便的

  • 本文向大家介绍python 查找文件名包含指定字符串的方法,包括了python 查找文件名包含指定字符串的方法的使用技巧和注意事项,需要的朋友参考一下 编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出绝对路径。 运行结果: 注意:在运行的时候如果选择y,也就是把.py文件所在的目录作为工作目录,此时最好不要把.py文件放到桌面上,因为会遍历桌面上的所有目

  • 假设您有一个装有物品的盒子。每个项目可能位于多个框中,因此每个项目都有一个指向项目所在框的ID数组。 ={... boxIds:['000001','000002','000003']...} 在mongoDB中,您可以说来获取子节点A和000002在box Ids数组中的所有其他子节点。这是我在mongoose(coffeescript)中尝试的: 编辑 盒子_id是正常的mongodb id字

  • 问题内容: 与其他类似文章一样,我需要从表中的Xml列应用条件中检索任何行,例如,假设您有一个类似xml的列: 我的查询将能够返回节点值和节点值所有的行。 想象一下,就像一个动态表,其中KEY节点代表列名,Value节点代表列的值。 由于键和值节点不是顺序的,因此以下查询不起作用: 问题答案: 而不是将和作为两个单独的搜索来查找,而是执行一次一次查找两者的单个查询,如下所示: