1

当逻辑列不一致时(例如当第一行中有标题时),您可以使用 xquery 对 xml 数据类型进行部分排序吗?

编辑有一个不好的例子,误导了原始问题的答案。我如何对typ列值进行排序,将 th 标题留在顶部?反之亦然,rts而是按整数列排序?

假设我将此 XML 存储在 mssql XML 字段中(select thexml from xmldata返回包含以下内容的一行):

<table cellpadding="2" cellspacing="3" border="1">
  <tr>
    <th>typ</th>
    <th>rts</th>
  </tr>
  <tr>
    <td>ABC</td>
    <td>26</td>
  </tr>
  <tr>
    <td>DCC</td>
    <td>21</td>
  </tr>
  <tr>
    <td>DBB</td>
    <td>4</td>
  </tr>
  <tr>
    <td>XBQ</td>
    <td>152</td>
  </tr>
  <tr>
    <td>AHI</td>
    <td>349</td>
  </tr>
</table>

现在说我想按 HTML 列排序typ。我正在寻找以下结果:

<table cellpadding="2" cellspacing="3" border="1">
  <tr>
    <th>typ</th>
    <th>rts</th>
  </tr>
  <tr>
    <td>ABC</td>
    <td>26</td>
  </tr>
  <tr>
    <td>AHI</td>
    <td>349</td>
  </tr>
  <tr>
    <td>DBB</td>
    <td>4</td>
  </tr>
  <tr>
    <td>DCC</td>
    <td>21</td>
  </tr>
  <tr>
    <td>XBQ</td>
    <td>152</td>
  </tr>
</table>

有没有 XQuery 专家可以帮我分析一下?

4

1 回答 1

2

要对特定列进行排序,请重建表,然后对非标题行进行排序:

SELECT thexml.query('
  element table {
    /table/@*,
    /table/tr[th], (: copy header :)
    for $r in /table/tr[not(th)] (: exclude header :)
    order by $r/td[1] (: $r/td[2] to sort on rts col :)
    return $r
  }')
FROM xmldata
于 2013-08-09T21:20:53.633 回答