在Oracle数据库中有一张表 Userinfo 包含字段username,uservcard..用户名是唯一的。其中uservcard是xmltype类型,保存一个xml。
内容如下:
<?xml version = "1.0" encoding = "GBK"?>
<Card xmlns="vcard">
<FN>JOON</FN>
<URL>http://baidu.com</URL>
<TITLE>java E</TITLE>
<NICKNAME>老顽童</NICKNAME>
<ADR>
<WORK/>
<PCODE>510000</PCODE>
<CTRY>中国</CTRY>
<LOCALITY>广州</LOCALITY>
</ADR>
<ADR>
<HOME/>
<PCODE>417700</PCODE>
<CTRY>美国</CTRY>
<LOCALITY>纽约</LOCALITY>
</ADR>
</Card>
其中 <WORK/>代表的是工作地址, <HOME/>代表的是家庭地址,<NICKNAME>代表昵称。
现要以用户名,昵称,工作地点和工作城市作为查询条件,写一条select语句实现如下结果:
这里的CTRY和LOCALITY指的都是工作地址USERNAME NICKNAME CTRY LOCALITY
test1 山刀浪子 中国 广州
test2 小龙女 中国 长沙
test3 null null null
只要有用户名符合条件就要求返回,类似于QQ查找好友。请问各位前辈这个select语句怎么写?关键是需要解决Oracle查询xml时怎么指定命名空间,
另外一个就是相同节点怎么查询和返回单条节点的值?请各位前辈指点,万分感谢!
内容如下:
<?xml version = "1.0" encoding = "GBK"?>
<Card xmlns="vcard">
<FN>JOON</FN>
<URL>http://baidu.com</URL>
<TITLE>java E</TITLE>
<NICKNAME>老顽童</NICKNAME>
<ADR>
<WORK/>
<PCODE>510000</PCODE>
<CTRY>中国</CTRY>
<LOCALITY>广州</LOCALITY>
</ADR>
<ADR>
<HOME/>
<PCODE>417700</PCODE>
<CTRY>美国</CTRY>
<LOCALITY>纽约</LOCALITY>
</ADR>
</Card>
其中 <WORK/>代表的是工作地址, <HOME/>代表的是家庭地址,<NICKNAME>代表昵称。
现要以用户名,昵称,工作地点和工作城市作为查询条件,写一条select语句实现如下结果:
这里的CTRY和LOCALITY指的都是工作地址USERNAME NICKNAME CTRY LOCALITY
test1 山刀浪子 中国 广州
test2 小龙女 中国 长沙
test3 null null null
只要有用户名符合条件就要求返回,类似于QQ查找好友。请问各位前辈这个select语句怎么写?关键是需要解决Oracle查询xml时怎么指定命名空间,
另外一个就是相同节点怎么查询和返回单条节点的值?请各位前辈指点,万分感谢!
SELECT EXTRACTVALUE(x, '/Card/NICKNAME', 'xmlns="vcard"') NICKNAME,
EXTRACTVALUE(x, '/Card/CITY', 'xmlns="vcard"') CITY,
EXTRACTVALUE(x, '/Card/LOCALITY', 'xmlns="vcard"') LOCALITY
FROM (SELECT XMLTYPE('<Card xmlns="vcard"><NICKNAME>小强</NICKNAME><CITY>China</CITY><LOCALITY>BJ</LOCALITY></Card>') X
FROM dual);
NICKNAME CITY LOCALITY
--------------- --------------- ---------------
小强 China BJ
但是,还有个小的问题,就是我的这个节点在Oracle数据库中有一张表 Userinfo 包含字段username,uservcard..用户名是唯一的。其中uservcard是xmltype类型,保存一个xml。
内容如下:
<?xml version = "1.0" encoding = "GBK"?>
<Card xmlns="vcard">
<FN>JOON</FN>
<URL>http://baidu.com</URL>
<TITLE>java E</TITLE>
<NICKNAME>老顽童</NICKNAME>
<ADR>
<WORK/>
<PCODE>510000</PCODE>
<CTRY>中国</CTRY>
<LOCALITY>广州</LOCALITY>
</ADR>
<ADR>
<HOME/>
<PCODE>417700</PCODE>
<CTRY>美国</CTRY>
<LOCALITY>纽约</LOCALITY>
</ADR>
节点名是相同的,然后我只想返回
<ADR>
<WORK/>
<PCODE>510000</PCODE>
<CTRY>中国</CTRY>
<LOCALITY>广州</LOCALITY>
</ADR>
这个节点里的值‘中国’ ‘广州’。
小弟不才,希望你帮忙帮到底,结贴分全给上。另外
FROM (SELECT XMLTYPE('<Card xmlns="vcard"><NICKNAME>小强</NICKNAME><CITY>China</CITY><LOCALITY>BJ</LOCALITY></Card>') X
FROM dual);
这里我不是很明白,希望给与指教,怎么把这个改写成从字段里读取?谢谢!
EXTRACTVALUE(uservcard, '/Card/CITY', 'xmlns="vcard"') CITY,
EXTRACTVALUE(uservcard, '/Card/LOCALITY', 'xmlns="vcard"') LOCALITY
from Userinfo
这样确实是可以查不同节点的值,就这条语句NICKNAME是可以查出来的,因为NICKNAME的节点是唯一的。但是CITY和LOCALITY是查询不出来的,不知你有没有试过,我现在就想解决的问题是相同节点<ADR>只返回一个节点的值,这样就可以了。
EXTRACTVALUE(uservcard, '/Card/ADR/CITY', 'xmlns="vcard"') CITY 这样写的。
但这样写会报错,说节点会返回两个值,我的想法是用虚拟表
table(XMLSequence(extract(uservcard,'/Card/ADR/CTRY'))) i, 但这样查询出来会返回多条记录。
不知道你有没有明白我的意思,这就是我的第二个问题。
'/Card/LOCALITY' -> '/Card/LOCALITY[1]'
EXTRACTVALUE(uservcard, '/Card/CITY[1]', 'xmlns="vcard"') CITY,
EXTRACTVALUE(uservcard, '/Card/LOCALITY[1]', 'xmlns="vcard"') LOCALITY
from Userinfo
是这样写吗?这样好像也不行哦,还是报错
EXTRACTVALUE只返回一个节点的值,语句执行不了
这个是正确的,终于解决了,节省了我不少的时间,谢谢hyee!