SQL 服务器 - 从 HierarchyId 字段获取第一个节点
SQL Server - Get first node from HierarchyId field
假设我的 SQL 服务器 table 中有以下 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/
并且我想编写一个查询 returns 以下 INT
TopNode
列 -
基本上 returning 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 数据类型还很陌生,在找到 GetDescendant
、GetLevel
等之间的正确函数以便能够 return 这个整数时遇到问题。
如何以最简单的方式完成此操作?
这应该有效:
SELECT SUBSTRING(YourString, CHARINDEX('/', YourString) + 1, CHARINDEX('/', YourString,CHARINDEX('/', YourString)+1) - (CHARINDEX('/', YourString) + 1))
FROM YourTable;
这对你有用吗?
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)
假设我的 SQL 服务器 table 中有以下 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/
并且我想编写一个查询 returns 以下 INT
TopNode
列 -
基本上 returning 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 数据类型还很陌生,在找到 GetDescendant
、GetLevel
等之间的正确函数以便能够 return 这个整数时遇到问题。
如何以最简单的方式完成此操作?
这应该有效:
SELECT SUBSTRING(YourString, CHARINDEX('/', YourString) + 1, CHARINDEX('/', YourString,CHARINDEX('/', YourString)+1) - (CHARINDEX('/', YourString) + 1))
FROM YourTable;
这对你有用吗?
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)