2012-04-17 2 views
0

У меня есть столбец hierarchyid` в определенном на столе в SQL Server 2008Сортировать по hierarchyid` в в SQL Server

Будет говорить, что в первом ряду, `hierarchyid` является«/ 1/7/1 /»

Скажем, что во втором ряду иерархия равна '/ 1/10/1 /'

Если I sort by hierarchyid ASC, то я увижу вторую строку, а затем первую строку. (Сортировка будет сортироваться по String и '10' < '7')

Однако у меня есть (по соображениям совместимости с другой системой) желание сначала увидеть первую строку, а затем вторую строку (т.е. sort by int и 7 < 10)

Я решил проблему, указав второй столбец иерархии, а затем установив ее таким же, как и первый столбец иерархии, но заменив все внутренние косые черты точками, а затем делая вид.

Мне просто интересно, был ли более элегантный способ.

+2

Вы уверены, что используете [hierarchyid] (http://technet.microsoft.com/en-us/library/bb677290.aspx) ?. Швы работают должным образом. Посмотрите [здесь] (http://sqlfiddle.com/#!3/d7cfe/2). –

+0

Вы правы (отличная ссылка, между прочим). Мне нужно будет проверить, что я сделал неправильно ... (Я использую hierarchyID, но, возможно, есть и другие факторы) – gordon613

ответ

0

вам нужно будет выделить между двумя «/» и заказать его. вы можете использовать эту функцию: http://www.sqlusa.com/bestpractices2005/nthindex/

, чтобы получить п-й индекс на шнурке, так

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

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

возвращает 3. Их вы должны выяснить позицию третьего «/» и получить то, что между Это.

его не трудно, но довольно много работы

+0

Большое спасибо за ваше предложение. Это решение предполагает, что идентификатор hierarchyID всегда три уровня. В моем вопросе я хотел представить проблему как можно проще, но иерархия ID может быть любым количеством уровней. – gordon613

+0

ваш пример не является иерархическим, его тип данных varchar! –

0

Я знаю, что это довольно старый вопрос, но это был первый результат в Google, так думал, что я хотел бы добавить фактический ответ в случае, если кто-то попадается это. Не видя 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) AS RowNumber FROM MyTable', и ваш ответ затем объяснит, что «order by HIERARCHY» использовал не исходное поле, а .ToString(). – gordon613

+0

Если это был мой оригинальный код, тогда мой оригинальный вопрос был не совсем понятен. Но так как это было так давно, я не совсем понимаю, почему я задал свой вопрос так, как я это сделал. Во всяком случае, мое неисчерпаемое решение уже давно работает, и я не буду в ближайшем будущем работать над этим разделом кода. Мне жаль, что у меня нет ресурсов на данный момент, чтобы работать над этим, и оценить свой ответ. – gordon613

Смежные вопросы