sql - 排名超过切碎的 xml

标签 sql sql-server sql-server-2005 tsql sqlxml

给定以下 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/

相关文章:

mysql - 在选择时插入 0 以表示空返回(在任务计划程序上运行的 SQL 脚本)

sql - 将 SQL Server 2008 数据库文件移动到新文件夹位置

sql-server-2005 - 如何将亚美尼亚语字符串插入 SQL Server 数据库

sql-server - SQL Server 存储过程创建临时表并插入值

sql-server-2005 - 不同的行值作为列 Sql Server

sql - 基于子元素值使用 PLSQL 提取 XML

mysql - IN查询有什么区别

sql - "Results to Text"选项中设置的 SQL Server 中的自定义分隔符不起作用

sql - SQL Server 中的 UNION 如何将一行与另一行进行比较?

sql-server - 在 SQL Server 中,如何将多个 .trc 文件移动/导入到跟踪表