SQL Server - 从HierarchyId字段获取第一个节点

时间:2017-12-20 16:28:46

标签: sql-server hierarchical-data hierarchyid

假设我的SQL Server表中有以下HIERARCHYID列:

MyCol   
/1/1/   
/2/1/   
/3/1/1/ 
/3/1/2/ 
/3/2/1/1/   
/3/2/1/2/   
/4/1/   
/4/2/   
/5/1/   
/6/1/   
/7/1/   
/8/1/   
/8/2/   

我想编写一个返回以下INT TopNode列的查询 -  基本上返回MyCol列的顶级值:

MyCol       TopNode
/1/1/       1
/2/1/       2
/3/1/1/     3
/3/1/2/     3
/3/2/1/1/   3
/3/2/1/2/   3
/4/1/       4
/4/2/       4
/5/1/       5
/6/1/       6
/7/1/       7
/8/1/       8
/8/2/       8

我使用HierarchyId数据类型相当新,并且在GetDescendantGetLevel之间找到正确的函数时遇到问题,以便能够返回此整数。

我怎样才能以最简单的方式实现这一目标?

2 个答案:

答案 0 :(得分:2)

这应该有效:

SELECT SUBSTRING(YourString, CHARINDEX('/', YourString) + 1, CHARINDEX('/', YourString,CHARINDEX('/', YourString)+1) - (CHARINDEX('/', YourString) + 1))
FROM YourTable;

答案 1 :(得分:2)

这适用于您的情况吗?

DECLARE @T TABLE(X HIERARCHYID)
INSERT @T SELECT '/1/1/'   
INSERT @T SELECT '/2/1/'   
INSERT @T SELECT '/3/1/'  
INSERT @T SELECT '/3/2/'   
INSERT @T SELECT '/3/3/'   
INSERT @T SELECT '/3/4/'

SELECT 
    X.GetAncestor(X.GetLevel()-1),
    X.GetAncestor(X.GetLevel()-1).ToString()  
FROM @T

然后,您可以通过从简单替换 - >

进行强制转换来派生int
TopLevel = CAST(REPLACE(X.GetAncestor(X.GetLevel()-1).ToString(),'/','') AS INT)