1

SQL Server 2008 のテーブルに hierarchyid 列が定義されています

最初の行で、hierarchyid が「/1/7/1/」であるとします。

2 行目で、hierarchyid が「/1/10/1/」であるとします。

Isort by hierarchyid ASCの場合、2 行目が表示され、次に最初の行が表示されます。(ソートは文字列順、'10'<'7')

ただし、(別のシステムとの互換性の理由から) 最初の行を最初に表示し、次に 2 番目の行を表示したい (つまり、int で並べ替え、7<10)

2番目のhierarchyid列を定義し、最初のhierarchyid列と同じに設定することで問題を解決しましたが、内部のすべてのスラッシュをドットに置き換えてから、これで並べ替えを行いました。

もっとエレガントな方法があるのだろうかと思っただけです。

4

2 に答える 2

1

これはかなり古い質問であることは知っていますが、Google での最初の結果だったので、他の誰かがこれに出くわした場合に備えて、実際の回答を追加すると思いました。SQLが使用されているのを見なければ、100%になるのは難しいですが、OPが階層ID自体をソートするのではなく、階層IDを文字列として返し、それをソートしていると思われます:

例えば..

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
于 2013-10-07T10:40:13.347 に答える
0

2つの「/」の間の内容を分離して並べ替える必要があります。この関数を使用できます: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を返します。3番目の「/」の位置を見つけて、その間にあるものを取得する必要があります。

難しいことではありませんが、かなりの作業が必要です

于 2012-04-17T13:06:52.980 に答える