我在SQL Server 2008中的表上定义了hierarchyid列
让我们说在第一行中,hierarchyid是'/ 1/7/1 /'
让我们说在第二行中,hierarchyid是'/ 1/10/1 /'
如果我sort by hierarchyid ASC
,那么我会看到第二行,然后是第一行。 (排序将按字符串排序,并且'10'<'7')
然而,我(为了具有不同系统的兼容性原因)希望首先看到第一行,然后是第二行(即按int排序,7< 10)
我已经解决了这个问题,通过定义第二个hierarchyid列,然后将其设置为与第一个hierarchyid列相同,但用点替换所有内部斜杠,然后按此排序。
我只是想知道是否有更优雅的方式。
答案 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