SQL 查询多条XML数据里面的某个节点的值

jun870529 2011-08-17 04:09:38
现在表里面有个字段专门存放xml格式的数据

现在我想把符合条件的数据查找出来 假如xml里面有个A元素值为2

我想问应该怎么操作呢就是把包含xml里某个节点的值符合条件的数据显示出来

...全文
714 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengxiaohan211 2013-06-24
  • 打赏
  • 举报
回复
今天刚好看到 感觉下面很多回答都很不错。。感谢
fcuandy 2011-08-17
  • 打赏
  • 举报
回复
.=xxx
相当于 text()=xxx
fcuandy 2011-08-17
  • 打赏
  • 举报
回复
//child[.=xxx]

xml是节点型文档, 有属性和文本两种值。
<xxx id="1">aaa</xxx>
aaa是节点文本值。
id是节点的一个属性,

而节点文本值在xquery里是默认的属性, .代表当前节点, .=xxx 即表示当前节点文本值为xxx
[@id="1"]即表示取id属性为1`
fcuandy 2011-08-17
  • 打赏
  • 举报
回复
加不加/或//, 看你自己需求。
你可以下载ms的xml sdk看关于xpath的东西,就知道这些寻址的区别。
jun870529 2011-08-17
  • 打赏
  • 举报
回复
我知道了

--1、文档 
select @ data
--2、任意级别是否存在price节点
select @ data . exist ('//price' )
--3、获取所有book节点
select @ data . query ('//book' )
--4、获取所有包含lang属性的节点
select @ data . query ('//*[@lang]' )
--5、获取第一个book节点
select @ data . query ('//book[1]' )
--6、获取前两个book节点
select @ data . query ('//book[position()<=2]' )
--7、获取最后一个book节点
select @ data . query ('//book[last()]' )
--8、获取price>35的所有book节点
select @ data . query ('//book[price>35]' )
--9、获取category="WEB"的所有book节点
select @ data . query ('//book[@category="WEB"]' )
--10、获取title的lang="en"的所有book节点
select @ data . query ('//book/title[@lang="en"]' )
--11、获取title的lang="en"且 price>35的所有book节点
select @ data . query ('//book[./title[@lang="en"] or price>35 ]' )
--12、获取title的lang="en"且 price>35的第一book的(第一个)title
select @ data . query ('//book[./title[@lang="en"] and price>35 ]' ). value ('(book/title)[1]' , 'varchar(max)' )
--13、等价于10
select @ data . value ('(//book[./title[@lang="en"] and price>35 ]/title)[1]' , 'varchar(max)' )
--14、获取title的lang="en"且 price>35的第一book的(第一个)title的lang属性
select @ data . value ('((//book[@category="WEB" and price>35 ]/title)[1]/@lang)[1]' , 'varchar(max)' )
--15、获取第一本书的title
select Tab . Col . value ('(book/title)[1]' , 'varchar(max)' ) as title
from @ data . nodes ('bookstore' )as Tab (Col )
--16、获取每本书的第一个author
select Tab . Col . value ('author[1]' , 'varchar(max)' ) as title
from @ data . nodes ('//book' )as Tab (Col )
--17、获取所有book的所有信息
select
T . C . value ('title[1]' , 'varchar(max)' ) as title ,
T . C . value ('year[1]' , 'int' ) as year ,
T . C . value ('title[1]' , 'varchar(max)' )as title ,
T . C . value ('price[1]' , 'float' ) as price ,
T . C . value ('author[1]' , 'varchar(max)' ) as author1 ,
T . C . value ('author[2]' , 'varchar(max)' ) as author2 ,
T . C . value ('author[3]' , 'varchar(max)' ) as author3 ,
T . C . value ('author[4]' , 'varchar(max)' ) as author4
from @ data . nodes ('//book' ) as T (C )
--18、获取不是日语(lang!="jp")且价格大于35的书的所有信息
select
T . C . value ('title[1]' , 'varchar(max)' ) as title ,
T . C . value ('year[1]' , 'int' ) as year ,
T . C . value ('title[1]' , 'varchar(max)' )as title ,
T . C . value ('price[1]' , 'float' ) as price ,
T . C . value ('author[1]' , 'varchar(max)' ) as author1 ,
T . C . value ('author[2]' , 'varchar(max)' ) as author2 ,
T . C . value ('author[3]' , 'varchar(max)' ) as author3 ,
T . C . value ('author[4]' , 'varchar(max)' ) as author4
from @ data . nodes ('//book[./title[@lang!="jp"] and price>35 ]' ) as T (C )

jun870529 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fcuandy 的回复:]
SQL code

DECLARE @x XML
SET @x='
<MasterxRow>
<ActivityType>2</ActivityType>
<ProductType>21</ProductType>
<RefNo>222222222222222222222</RefNo>
<ContactResult>0</ContactResult>
</Mas……
[/Quote]

('//ProductType[.=21]')=1
我试过去掉//或者加根节点都查询不到反而加了//就能出来
能不能具体解释一下//还有[.]的含义 ?谢谢
fcuandy 2011-08-17
  • 打赏
  • 举报
回复
DECLARE @x XML
SET @x='
<MasterxRow>
<ActivityType>2</ActivityType>
<ProductType>21</ProductType>
<RefNo>222222222222222222222</RefNo>
<ContactResult>0</ContactResult>
</MasterxRow>'

IF @x.exist('//ProductType[.=21]')=1
PRINT 'aa'
ELSE
PRINT 'bb'



把条件应用到你的where子句即可。
jun870529 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangck 的回复:]
select * from tb
where xmltype.exist('xquery')=1
[/Quote]

还是查不出来
我点开一个xml是这样的格式
<MasterxRow>
<ActivityType>2</ActivityType>
<ProductType>21</ProductType>
<RefNo>222222222222222222222</RefNo>
<ContactResult>0</ContactResult>
</MasterxRow>

select * from tblproduct where ProductResponse.exist('MasterxRow/ProductType')='21'
这样子吗?
快溜 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangck 的回复:]
select * from tb
where xmltype.exist('xquery')=1
[/Quote]+
liangCK 2011-08-17
  • 打赏
  • 举报
回复
select * from tb
where xmltype.exist('xquery')=1

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧