按SQL Server中的hierarchyid排序

时间:2012-04-17 12:53:58

标签: sql-server-2008

我在SQL Server 2008中的表上定义了hierarchyid列

让我们说在第一行中,hierarchyid是'/ 1/7/1 /'

让我们说在第二行中,hierarchyid是'/ 1/10/1 /'

如果我sort by hierarchyid ASC,那么我会看到第二行,然后是第一行。 (排序将按字符串排序,并且'10'<'7')

然而,我(为了具有不同系统的兼容性原因)希望首先看到第一行,然后是第二行(即按int排序,7< 10)

我已经解决了这个问题,通过定义第二个hierarchyid列,然后将其设置为与第一个hierarchyid列相同,但用点替换所有内部斜杠,然后按此排序。

我只是想知道是否有更优雅的方式。

2 个答案:

答案 0 :(得分:0)

你需要在两个“/”之间隔离什么,并按顺序排序。 你可以使用这个功能:http://www.sqlusa.com/bestpractices2005/nthindex/

获取字符串上的第n个索引,所以

declare @aux_str varchar(50)
set @aux_str='/1/7/3/'

select dbo.fnNthIndex(@aux_str,'/',2) 

返回3.他们必须找出第三个“/”的位置并得到它之间的内容。

它并不难,但它的工作量很大

答案 1 :(得分:0)

我知道这是一个相当古老的问题,但这是谷歌的第一个结果,所以我想添加一个实际的答案以防其他人遇到这个问题。在没有看到使用SQL的情况下,很难100%但我怀疑OP将层次结构Id作为字符串返回并对其进行排序而不是对层次结构ID本身进行排序:

EG ..

declare @results table (Id int, Hierarchy hierarchyId)

-- :
-- Add your data here
-- :

-- This will not work as it's ordering a string
select Id, Hierarchy.ToString() as SortOrder from @results order by SortOrder

-- This will work as it's ordering the hierarchy id
select Id, Hierarchy.ToString() as SortOrder from @results order by Hierarchy