建表语句:
CREATE TABLE [OrderbyTest] (
[COrderby] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[id] [int] IDENTITY (1, 1) NOT NULL ,
CONSTRAINT [PK_OrderbyTest] PRIMARY KEY  CLUSTERED 
(
[id]
)  ON [PRIMARY] 
) ON [PRIMARY]
GO原数据:
COrderby id
---------------------
1 1
11 6
2 7
3 8
4 9
6 10
20 11
1.1 14
1.1.1 15
2.1 16
2.1.1 17
2.1.1.1 18需求:SELECT 后得出以下结果:
COrderby id
1 1
1.1 14
1.1.1 15
2 7
2.1 16
2.1.1 17
2.1.1.1 18
3 8
4 9
6 10
11 6
20 11

解决方案 »

  1.   

    SELECT 
    *
    FROM OrderbyTest 
    ORDER BY 
    ISNULL(RIGHT(PARSENAME([COrderby],4)+1000,3),'')+
    ISNULL(RIGHT(PARSENAME([COrderby],3)+1000,3),'')+
    ISNULL(RIGHT(PARSENAME([COrderby],2)+1000,3),'')+
    ISNULL(RIGHT(PARSENAME([COrderby],1)+1000,3),'') asc
     
    /*
    COrderby id
    1 1
    1.1 14
    1.1.1 15
    2 7
    2.1 16
    2.1.1 17
    2.1.1.1 18
    3 8
    4 9
    6 10
    11 6
    20 11
    */
      

  2.   

    ;WITH T1
    AS
    (
    SELECT *,rn=0,ord=CAST(RIGHT(ID+1000,3) AS NVARCHAR(200)) FROM OrderbyTest AS a WHERE [COrderby] NOT LIKE '%.%'
    UNION ALL
    SELECT b.*,rn=a.rn+1,ord=CAST(a.ord+RIGHT(b.ID+1000,3) AS NVARCHAR(200)) FROM t1 AS a INNER JOIN OrderbyTest AS b ON b.[COrderby] LIKE a.[COrderby]+'.%' AND LEN(b.[COrderby])-LEN(REPLACE(b.[COrderby],'.',''))=a.rn+1
    )
    SELECT [COrderby],[id] FROM t1 ORDER BY ord
    /*
    COrderby id
    1 1
    1.1 14
    1.1.1 15
    11 6
    2 7
    2.1 16
    2.1.1 17
    2.1.1.1 18
    3 8
    4 9
    6 10
    20 11
    */