给定以下 XML 示例和将 xml 分解为关系的 select
语句,我需要的是 select
的第二列类别的序数(在这种情况下,方向为 1,颜色为 2)。
注意:选择中的文字值“rank()”保留为占位符。我正在尝试使用 rank
,但没有成功。
declare @x xml
set @x = '
<root>
<category>
<item value="north"/>
<item value="south"/>
<item value="east"/>
<item value="west"/>
</category>
<category>
<item value="red"/>
<item value="green"/>
<item value="blue"/>
</category>
</root>'
select c.value('./@value', 'varchar(10)') as "ItemValue",
'rank()' as "CategoryNumber"
from @x.nodes('//item') as t(c)
最佳答案
Jacob Sebastian 在他的博文中也提出了一个有趣的解决方案:
XQuery Lab 23 - Retrieving values and position of elements
根据 Jacob 的建议,我可以将您的查询重写为:
SELECT
x.value('@value','VARCHAR(10)') AS 'ItemValue',
p.number as 'CategoryNumber'
FROM
master..spt_values p
CROSS APPLY
@x.nodes('/root/category[position()=sql:column("number")]/item') n(x)
WHERE
p.type = 'p'
我得到了想要的输出:
ItemValue CategoryNumber
--------- --------------
north 1
south 1
east 1
west 1
red 2
green 2
blue 2
不幸的是,没有一个更明显的解决方案,如 position()
或 fn:id()
函数似乎 a) 在 SQL Server 中工作或 b) 被支持完全在 SQL Server 中:-(
希望对你有帮助
马克
关于sql - 排名超过切碎的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1532705/