2012-04-17 64 views
0

我在SQL Server上表中定义的HIERARCHYID列2008排序HIERARCHYID在SQL Server

让我们说,在第一行中,该HIERARCHYID为 '/ 1/7/1 /'

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

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

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

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

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

+2

您确定您使用[hierarchyid](http://technet.microsoft.com/zh-cn/library/bb677290.aspx)?.接缝按预期工作。看看[这里](http://sqlfiddle.com/#!3/d7cfe/2)。 – 2012-04-17 13:13:34

+0

你是对的(顺便说一下,很棒的链接)。我将不得不检查我做错了什么......(我使用的是hierarchyID,但也许还有其他一些因素) – gordon613 2012-04-17 13:34:17

回答

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.他们,你必须找出第三“/”的位置,并得到之间有什么它。

它并不难,但其相当多的工作的

+0

非常感谢您的建议。此解决方案假定hierarchyID始终为三个级别。在我的问题中,我想尽可能简单地提出问题,但是hierarchyID可以是任意数量的级别。 – gordon613 2012-04-17 13:12:20

+0

你的例子不是hierarchyId,它的varchar数据类型! – 2013-09-12 14:34:55

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 
+0

谢谢你的建议。我想你可能是对的,因为我试图重新生成我的预生成代码,它可能是以下'select * from ...,HIERARCHY.ToString()作为HIERARCHY,ROW_NUMBER()OVER(PARTITION BY HIERARCHY order by HIERARCHY)作为RowNumber FROM MyTable',你的答案会解释'HIERARCHY的顺序'不是使用原始字段,而是使用.ToString()。 – gordon613 2013-10-08 15:43:36

+0

如果这是我的原始代码,那么我的原始问题根本不明确。但是,既然这是很久以前的事情,我不太清楚为什么我以我所做的方式问我的问题。无论如何,我非常优雅的解决方案已经投入生产了很长一段时间,而且我不是 - 在不久的将来 - 开始编写代码的这一部分。对不起,我目前还没有资源来处理这个问题,并对您的答案进行评分。 – gordon613 2013-10-08 15:45:25