SQL如何實現1-1,1,1-2-1,2-1,2-1-2-3,1-3,10-1這樣的排序?
要求結果是
11-11-2-1
1-32-12-1-2-310-1
難道按照字元串排序不就應該是這樣的嗎
最近做了個多級數據導入的功能,客戶嫌在Excel中通過ID與父ID來描述父子關係太複雜。想好久沒有方案,有一天看到word文檔結構圖時,突然來了靈感,於是採用一列描述法:11.1
2
2.12.234...
為了配合原有數據結構,入庫前做轉換,導出時也做轉換。如果大神們有更好方案,請指教。每段定長的,讓他自己錄成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 |