现在表里面有个字段专门存放xml格式的数据现在我想把符合条件的数据查找出来  假如xml里面有个A元素值为2我想问应该怎么操作呢就是把包含xml里某个节点的值符合条件的数据显示出来

解决方案 »

  1.   

    select * from tb
    where xmltype.exist('xquery')=1
      

  2.   


    还是查不出来
    我点开一个xml是这样的格式
    <MasterxRow>
        <ActivityType>2</ActivityType>
        <ProductType>21</ProductType>
        <RefNo>222222222222222222222</RefNo>
        <ContactResult>0</ContactResult>
    </MasterxRow>select * from tblproduct where ProductResponse.exist('MasterxRow/ProductType')='21'
    这样子吗?
      

  3.   

    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子句即可。
      

  4.   


    ('//ProductType[.=21]')=1
    我试过去掉//或者加根节点都查询不到反而加了//就能出来
    能不能具体解释一下//还有[.]的含义 ?谢谢
      

  5.   

    我知道了--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 )
      

  6.   

    加不加/或//, 看你自己需求。
    你可以下载ms的xml sdk看关于xpath的东西,就知道这些寻址的区别。
      

  7.   

    //child[.=xxx]xml是节点型文档,  有属性和文本两种值。
    <xxx id="1">aaa</xxx>
    aaa是节点文本值。
    id是节点的一个属性, 而节点文本值在xquery里是默认的属性,  .代表当前节点,   .=xxx 即表示当前节点文本值为xxx
    [@id="1"]即表示取id属性为1`
      

  8.   

    .=xxx 
    相当于 text()=xxx