2012-04-17 46 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