2011-06-28 8 views
2

私は木構造を表すデータを持つテーブルを持っています.1つの列は階層ツリーの行の位置を示しています。各レベルは-で区切られています。数字ではない階層の文字列による順序付け

1 
1-1 
2 
2-1 
2-2 
2-2-1 
2-2-2 
2-2-2-1 

ツリーは、単にこの列のORDER BYで順番に取得されます。カラムがアルファベット順にソートされるため、10レベル以上のアイテムがある場合は、これが下になります。 MySQLは3の前に10をソートします。

Actual result: 

1 
1-10 
1-3 
2 

Desired result: 

1 
1-3 
1-10 
2 

値には任意のレベルの深さがあります。

MySQLでこのデータを数値でソートすることはできますか?

答えて

2

あなたのベストショットは、自然に並べ替えるものにデータを変換することだと思います。ツリー構造が常に99人以下の子供を持つ場合、私は以下のような関数を作成することができます。 sort関数で "GetTreeStructureSort(columnName)"を使用するだけです。この中

1 
1-10 
1-3 
2 

:(。あなたは3桁の数字の可能性を持っている場合は、あなたがより直感的に、これを調整することができます)

CREATE FUNCTION GetTreeStructureSort 
(
    -- Add the parameters for the function here 
    @structure varchar(500) 
) 
RETURNS varchar(500) 
AS 
BEGIN 

    DECLARE @sort varchar(500) 

    -- Add a hyphen to the beginning and end to make all the numbers from 1 to 9 easily replaceable 
    SET @sort = '-' + @structure + '-' 

    -- Replace each instance of a one-digit number to a two-digit representation 
    SELECT @sort = REPLACE(@sort, '-1-', '-01-') 
    SELECT @sort = REPLACE(@sort, '-2-', '-02-') 
    SELECT @sort = REPLACE(@sort, '-3-', '-03-') 
    SELECT @sort = REPLACE(@sort, '-4-', '-04-') 
    SELECT @sort = REPLACE(@sort, '-5-', '-05-') 
    SELECT @sort = REPLACE(@sort, '-6-', '-06-') 
    SELECT @sort = REPLACE(@sort, '-7-', '-07-') 
    SELECT @sort = REPLACE(@sort, '-8-', '-08-') 
    SELECT @sort = REPLACE(@sort, '-9-', '-09-') 

    -- Strip off the first and last hyphens that were added at the beginning. 
    SELECT @sort = SUBSTRING(@sort, 2, LEN(@sort) - 2) 

    -- Return the result of the function 
    RETURN @sort 

END 

これは、これらの結果を変換します

01 
01-03 
01-10 
02 

私はこれを次のコードでテストしました:

DECLARE @something varchar(255) 
set @something = '1-10-3-21' 

SELECT dbo.GetTreeStructureSort(@something) 
+0

ゼロを含むパディング数<10がまさに私が必要とするものです。それが指摘された時は明らかです。このようなきめ細かな答えをありがとう。 – drewm

関連する問題