关于 XML 字段内容查询

找到个总结相当好的知识点的归纳,记在自己的博客里也方便查询

/*

sql xml 入门:

    --by jinjazz

    --http://blog.csdn.net/jinjazz

    

    1、xml:        能认识元素、属性和值

    

    2、xpath:    寻址语言,类似windows目录的查找(没用过dir命令的话就去面壁)

                

                语法格式,这些语法可以组合为条件:

                "."表示自己,".."表示父亲,"/"表示儿子,"//"表示后代,

                "name"表示按名字查找,"@name"表示按属性查找

                

                "集合[条件]" 表示根据条件取集合的子集,条件可以是

                    数  值:数字,last(),last()-数字 等

                    布尔值:position()<数字,@name=‘条件‘,name=‘条件‘

                条件是布尔值的时候可以合并计算:and or

    

    3、xquery:    基于xpath标的准查询语言,sqlserver xquery包含如下函数

                exist(xpath条件):返回布尔值表示节点是否存在

                query(xpath条件):返回由符合条件的节点组成的新的xml文档

                value(xpath条件,数据类型):返回指定的标量值,xpath条件结果必须唯一

                nodes(xpath条件): 返回由符合条件的节点组成的一行一列的结果表

*/

declare @data xml

set @data=

<bookstore>

<book category="COOKING">

  <title lang="en">Everyday Italian</title>

  <author>Giada De Laurentiis</author>

  <year>2005</year>

  <price>30.00</price>

</book>

<book category="CHILDREN">

  <title lang="jp">Harry Potter</title>

  <author>J K. Rowling</author>

  <year>2005</year>

  <price>29.99</price>

</book>

<book category="WEB">

  <title lang="en">XQuery Kick Start</title>

  <author>James McGovern</author>

  <author>Per Bothner</author>

  <author>Kurt Cagle</author>

  <author>James Linn</author>

  <author>Vaidyanathan Nagarajan</author>

  <year>2003</year>

  <price>49.99</price>

</book>

<book category="WEB">

  <title lang="cn">Learning XML</title>

  <author>Erik T. Ray</author>

  <year>2003</year>

  <price>39.95</price>

</book>

</bookstore>

--测试语句,如果不理解语法请参考上面的xpath规则和xquery函数说明

--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、等价于12

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)

XML 字段在做数据库设计的时可以发挥巨大的作用 举个例子,就是为同一类但又互相有区别的数据对象,比如之前做的海关项目的不同种类的文书,这次做的引擎扫描对象的记录等等建立共同使用的通用数据表使用 XML字段可以存放不同数据结构,可以把互相不同的数据对象中不同的部分,存放至XML字段中,相同的部分抽象出来存放于正常字段中,这样的设计 既可以简化数据库的表,又能满足不同数据对象的查询需求,感觉以后可以多试试使用这种方法。

时间: 2024-11-02 08:28:15

关于 XML 字段内容查询的相关文章

记一次SQL xml字段关联查询

需求: 一张表是APP表,结构如下: app_category为该游戏所属的类别ID,xml字段类型 另一张表是类别表,就ID对应名称,这就不上图了. 还有一张表是每个游戏的下载记录,结构如下: DownLogs_APPId为对应的游戏 那么需求来了,要查询游戏的下载记录,查询字段中要有游戏的所属类别名称,多个用逗号分隔 查询结果应如下: 最终的执行语句如下: select APP_Id,APP_Name,LEFT(App_Category,len(App_Category)-1) as App

(轉載)sql server xml字段的操作

原文轉自:http://blog.csdn.net/hliq5399/article/details/8315373 今天用到sql server 的xml字段,首先这个项目中的xml字段都存为了ntext字段,所以第一个操作 ntext 转化为 xml 以下摘自 http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/09/18/sql2005-nvarchar-to-xml.aspx XmlString是一個NText欄位,裡面放

(转)SQL对Xml字段的操作

T-Sql操作Xml数据 一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB). 用户将一个XML数据存入数据库的时候,可以使用这个XML的字符串,SQL Server会自动的将这个字符串转化为XML类型,并存储到数据库中. 随着SQL Server 对XM

SQL对Xml字段的操作

原文:SQL对Xml字段的操作 T-Sql操作Xml数据 一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XML 模型特征(例如文档顺序和递归结构),XML 值以内部格式存储为大型二进制对象 (BLOB). 用户将一个XML数据存入数据库的时候,可以使用这个XML的字符串,SQL Server会自动的将这个字符串转化为XML类型,并存储到数据库中.

Oracle group by 多表多字段关联查询

group by 多表多字段关联查询 自己遇到一个问题,就是开始的时候需要一个字段的名字和数量,但是是同个一个表的. 数据库代码如下: select  l.batchnum,count(l.batchnum) batcount    from ts_outphone_list l join ts_outphone_batch b on l.batchnum=b.batchnum left join om_user_list om on l.datamanager=om.login_id left

Navicat for MySQL 查看BLOB字段内容

Navicat for MySQL 查看BLOB字段内容查看BLOB内容的两种方法: 1. 在查询窗口中选中BLOB字段,点击备注 2.  查看->原始数据模式

Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create or replace type splitTable is table of varchar2(100); 2.创建函数fn_splitString(功能是将字符串分割成多条记录)--测试语句select * from table(fn_splitString('ernanyinv','nan'))

Java是如何读到hbase-site.xml 的内容的

ava是如何读到hbase-site.xml 的内容的 Java客户端使用的配置信息是被映射在一个HBaseConfiguration 实例中. HBaseConfiguration有一个工厂方法, HBaseConfiguration.create(); 运行这个方法的时候,他会去CLASSPATH,下找Hbase-site.xml,读他发现的第一个配置文件的内容. (这个方法还会去找hbase-default.xml ; hbase.X.X.X.jar里面也会有一个an hbase-defa

JS通过ajax动态读取xml文件内容

http://www.sharejs.com/codes/javascript/8178 HTML文件代码如下 <!DOCTYPE html> <html> <head> <script> function loadXMLDoc(url) { var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttp