在SQL中搜索XML列

时间:2009-03-30 13:42:11

标签: xml oracle select

有一个XML文档可以存储在Oracle数据库中的记录。

表CourseXML将包含:

Record_Number  int
XML_Type       int
XMLDoc         clob
...etc

我想通过XML标签在XMLDoc列中进行搜索。 XML文档有一个像这样的XML Schema:

<root>
  <UnitID="2" Name="Jerry" SName="Potter"/>
  <UnitID="3" Name="Jim" SName="Carelyn"/>
</root>

我想在UnitID =“2”进行搜索,我只想要Jerry的xml行。我如何制作一个select语句查询来获取该xml行?

4 个答案:

答案 0 :(得分:2)

您可能必须使用节点位才能使其准确无误。

SELECT
    y.item.value('@UnitID', 'int') AS UnitID,
    y.item.value('@Name', 'varchar(100)') AS [Name],
    y.item.value('@SName', 'varchar(100)') AS [SName]
FROM
    <table>
    CROSS APPLY
    XMLDoc.nodes('/root') AS y(item)
WHERE
    y.item.value('@UnitID', 'int') = 2

编辑:更正的代码使用表,而不是xml本地变量

答案 1 :(得分:2)

你有很多方法可以获得它。 “gbn”表现出一种方式 - 另外两种就在这里。

如果你想要整个“行”(我假设你会将这些东西放入标签中),试试这个:

select
    xmldoc.query('//node[@UnitID="2"]')
from
    xmltest

如果您只需要标记中的“名称”属性,请使用:

select
    xmldoc.value('(//node[@UnitID="2"]/@Name)[1]', 'varchar(20)')
from
    xmltest

如果您需要访问一大堆属性和/或子元素,请使用gbn的方法和“CROSS APPLY xmldoc.nodes(....)”。

享受! SQL Server 2005中的XML支持非常广泛且有用!

马克

答案 2 :(得分:0)

SELECT * FROM CourseXML
WHERE XMLDoc = 'UnitID="2"'
不是吗?或者我误解了什么?

答案 3 :(得分:0)

作为结构,并使用全文搜索。

<Root>
  <Tags>
    <TagName>Actividad</TagName>
    <Valor>Actividad 2</Valor>
  </Tags>
  <Tags>
    <TagName>Cliente</TagName>
    <Valor>Alpina</Valor>
  </Tags>
</Root>
 select 
     Filename
 from 
 Files
 where 
 CONTAINS(Tags,'Actividad')  and
 CONTAINS(Tags,'Cliente')  and
 Tags.exist('//Tags/Valor/text()[contains(., "Actividad 1")]')  = 1 and
 Tags.exist('//Tags/Valor/text()[contains(., "ADV")]')  = 1

我不建议在XML上使用属性,因为无法对属性执行全文搜索(无论SQL 2008 R2 Docs说什么)。

Please Refer to this