在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时怎么指定命名空间,
另外一个就是相同节点怎么查询和返回单条节点的值?请各位前辈指点,万分感谢!

解决方案 »

  1.   


    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
      

  2.   

    首先感谢这位朋友的热心帮忙,终于有人帮了一把了,至少解决了查询xml命名空间的问题。
    但是,还有个小的问题,就是我的这个节点在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);
    这里我不是很明白,希望给与指教,怎么把这个改写成从字段里读取?谢谢!
      

  3.   

    select username,EXTRACTVALUE(uservcard, '/Card/NICKNAME', 'xmlns="vcard"') NICKNAME,
           EXTRACTVALUE(uservcard, '/Card/CITY', 'xmlns="vcard"') CITY,
           EXTRACTVALUE(uservcard, '/Card/LOCALITY', 'xmlns="vcard"') LOCALITY
    from Userinfo 
      

  4.   


    这样确实是可以查不同节点的值,就这条语句NICKNAME是可以查出来的,因为NICKNAME的节点是唯一的。但是CITY和LOCALITY是查询不出来的,不知你有没有试过,我现在就想解决的问题是相同节点<ADR>只返回一个节点的值,这样就可以了。
     EXTRACTVALUE(uservcard, '/Card/ADR/CITY', 'xmlns="vcard"') CITY 这样写的。
    但这样写会报错,说节点会返回两个值,我的想法是用虚拟表
    table(XMLSequence(extract(uservcard,'/Card/ADR/CTRY'))) i, 但这样查询出来会返回多条记录。
    不知道你有没有明白我的意思,这就是我的第二个问题。
      

  5.   

    '/Card/CITY'  ->  '/Card/CITY[1]'
    '/Card/LOCALITY'  -> '/Card/LOCALITY[1]'
      

  6.   

    select username,EXTRACTVALUE(uservcard, '/Card/NICKNAME', 'xmlns="vcard"') NICKNAME,
      EXTRACTVALUE(uservcard, '/Card/CITY[1]', 'xmlns="vcard"') CITY,
      EXTRACTVALUE(uservcard, '/Card/LOCALITY[1]', 'xmlns="vcard"') LOCALITY
    from Userinfo  
    是这样写吗?这样好像也不行哦,还是报错
    EXTRACTVALUE只返回一个节点的值,语句执行不了
      

  7.   

    '/Card/ADR[1]/CITY' 
    这个是正确的,终于解决了,节省了我不少的时间,谢谢hyee!