有一字段Field记录如下
2-1
2-2
2-10
3-1-1
3-2-2
3-2-10
3-3
3-3-3
3-3-10
怎样才能得到如上的排列

解决方案 »

  1.   

    我写了个不限级别的。楼主可以试试。另外,我假设你每级的最大数字不超过 9999,也即每级可以用4位来表示
    --测试数据
    DECLARE @t TABLE(c VARCHAR(20))
    INSERT @t
    SELECT  '2-1'
    UNION SELECT '2-2'
    UNION SELECT '3-3-3'
    UNION SELECT '5-1'
    UNION SELECT '20-10'
    UNION SELECT '3-1-1'
    UNION SELECT '15-3'
    UNION SELECT '3-2-2'
    UNION SELECT '3-2-10'
    UNION SELECT '3-3'
    UNION SELECT '3-3-10'--显示结果
    SELECT * FROM @t ORDER BY dbo.DotIntToOrder(c)
    /*
    2-1
    2-2
    3-1-1
    3-2-2
    3-2-10
    3-3
    3-3-3
    3-3-10
    5-1
    15-3
    20-10
    */--自定义函数
    CREATE FUNCTION DotIntToOrder
    (@s VARCHAR(100))
    RETURNS VARCHAR(200)
    AS
    BEGIN
    DECLARE @tmps VARCHAR(4),@s1 VARCHAR(200)
    SELECT @tmps='',@s1=''
    WHILE CHARINDEX('-',@s)>0--LEN(REPLACE(@s,'-','--'))-LEN(@s)>=2
    BEGIN
    SET @tmps=LEFT(@s,CHARINDEX('-',@s)-1)
    SELECT @s1=@s1+REPLICATE('0',4-LEN(@tmps)) + RTRIM(@tmps),@s=STUFF(@s,1,CHARINDEX('-',@s),'')
    END
    SET @s1=@s1+REPLICATE('0',4-LEN(@s)) + RTRIM(@s)
    RETURN @s1
    END/*---------------------------------
    假如你的每级的数可能超过9999,那么将函数中的 @tmps变量的长度加长,另外,将函数中的 4-LEN(...)部分的常数4加大就可以了。比如改为5,就可以表示每级最大数为99999
    ----------------------------------*/