SQL如何實現1-1,1,1-2-1,2-1,2-1-2-3,1-3,10-1這樣的排序?

要求結果是

1

1-1

1-2-1

1-3

2-1

2-1-2-3

10-1


難道按照字元串排序不就應該是這樣的嗎


最近做了個多級數據導入的功能,客戶嫌在Excel中通過ID與父ID來描述父子關係太複雜。想好久沒有方案,有一天看到word文檔結構圖時,突然來了靈感,於是採用一列描述法:

1

1.1

2

2.1

2.2

3

4

...

為了配合原有數據結構,入庫前做轉換,導出時也做轉換。

如果大神們有更好方案,請指教。


每段定長的,讓他自己錄成01-1,這個不能慣著~_~

每段不定長的,拆欄位存,

select sec1+"-"+sec2+"-"+sec3 ... order by sec1, sec2, sec3

不然就扔一個欄位里,做個排序還要動字元串函數,性能不要了~_~


謝謝 @宮 磊 的提示。

思路是把2-1-3轉換成0002-0001-0003再排序。

首先搞個函數吧。

USE [TEST]
GO
/****** OBJECT: USERDEFINEDFUNCTION [DBO].[箱號擴展] SCRIPT DATE: 10/21/2016 08:18:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [DBO].[箱號擴展](@箱號 VARCHAR(50))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @新箱號 VARCHAR(50)
DECLARE @箱號後 VARCHAR(50)
SET @箱號後=@箱號
SET @新箱號=""

WHILE LEN(@箱號後)-LEN(REPLACE(@箱號後,"-",""))&>0
BEGIN
IF @新箱號=""
BEGIN
SET @新箱號=RIGHT("0000"+LEFT(@箱號後,PATINDEX("%-%",@箱號後)-1),4)
END
ELSE
BEGIN
SET @新箱號=@新箱號+"-"+RIGHT("0000"+LEFT(@箱號後,PATINDEX("%-%",@箱號後)-1),4)
END

SET @箱號後=REPLACE(@箱號後,LEFT(@箱號後,PATINDEX("%-%",@箱號後)),"")
END

IF @新箱號=""
BEGIN
SET @新箱號=RIGHT("0000"+@箱號後,4)
END
ELSE
BEGIN
SET @新箱號=@新箱號+"-"+RIGHT("0000"+@箱號後,4)
END

RETURN @新箱號
END

然後,

ORDER BY DBO.箱號擴展(箱號)

即可。


之前寫過類似需求,是讓用戶自己確定每段最大位數,代碼裡面把值補0成為0010-0001格式存在另一個欄位裡面用來排序


推薦閱讀:

經常有人發錯 SQL 的發音,如何華麗麗的引導糾正他們又不失優雅?
C# 初學者適合看《Ecma-334》來入門嗎?
ASP.NET ADO.NET 和C#編程語言他們之間的關係是怎樣的?
我一直覺得選課系統應該很好寫啊, 是我忽略掉了什麼重要的因素嗎?

TAG:SQL | 編程 | MicrosoftSQLServer |