SQL取xml中節點值

2022-04-29 10:03:07 字數 3652 閱讀 3837

/*

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='

everyday italian

giada de laurentiis

2005

30.00

harry potter

j k. rowling

2005

29.99

xquery kick start

james mcgovern

per bothner

kurt cagle

james linn

vaidyanathan nagarajan

2003

49.99

learning xml

erik t. ray

2003

39.95

'--測試語句,如果不理解語法請參考上面的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取節點名稱與節點值例項

declare xxml set x 88a5劉洋 388a5林林 1234 5678 9123 4 84a6陳真 384a6陳真 9876 5432 1234 5 45d1曹曹 345d1曹曹 1 按照節點的值取出其下節點中所有的節點名稱 如 ndid節點值為84 84 selectt.x.val...

sql 分組取最值

create table mobilelog id int primary key auto increment,自增id mobile varchar 26 手機號碼 log varchar 55 日誌資訊 createtime datetime 建立時間 獲取每個手機號碼最新的日誌資訊 先獲取所...

xml中的元素,節點

對於xslt 處理器來看,樹 就是要使用xslt轉換的xml原文件 中的元素,屬性,名字空間 注釋,文字內容,處理指令,還有整個文件 即看成 根節點 這7種都是節點。那麼元素節點僅僅是其中的一種。簡單的說元素節點就是使用用左右尖括號 如 的那個元素的節點。比如下面的xml文件 xml 對於xslt處...