代码之家  ›  专栏  ›  技术社区  ›  grenade

使用XQuery和filter-on属性透视XML

  •  0
  • grenade  · 技术社区  · 14 年前

    给定以下XML(在名为“xfield”的SQL列字段中):

    <data>
      <section>
        <item id="A">
          <number>987</number>
        </item>
        <item id="B">
          <number>654</number>
        </item>
        <item id="C">
          <number>321</number>
        </item>
      </section>
      <section>
        <item id="A">
          <number>123</number>
        </item>
        <item id="B">
          <number>456</number>
        </item>
        <item id="C">
          <number>789</number>
        </item>
      </section>
    </data>
    

    如何获得下表结构(带A、B和;C作为列名):

     A | B | C
    987|654|321
    123|456|789
    

    使用SQLXQuery,我尝试这样做(毫不奇怪,它是无效的):

    SELECT
      data.value('(./section/item[@ID = "A"]/number/[1])', 'int') as A,
      data.value('(./section/item[@ID = "B"]/number/[1])', 'int') as B,
      data.value('(./section/item[@ID = "C"]/number/[1])', 'int') as C
    FROM Table CROSS APPLY [xfield].nodes('/data') t(data)
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   AakashM    14 年前

    你就快到了。

    你需要使用 nodes() 将xml分解到 section 元素,所以切碎

    nodes('/data/section')
    

    [1] 部分 您将“加入”的节点:

    data.value('(item[@id = "A"]/number)[1]', 'int') as A,
    data.value('(item[@id = "B"]/number)[1]', 'int') as B,
    data.value('(item[@id = "C"]/number)[1]', 'int') as C
    

    A           B           C
    ----------- ----------- -----------
    987         654         321
    123         456         789