建表语句:
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
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
*
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
*/
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
*/