有一个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行?
答案 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说什么)。