1. 程式人生 > >SQL根據字串中的數字排序

SQL根據字串中的數字排序

USE [Test]
GO

SELECT 
ProcessName
,INDEX1
,INDEX2
,INDEX3
,CAST(SUBSTRING(ProcessName,0,INDEX1) AS INT)*10000
+CAST(SUBSTRING(ProcessName,INDEX1+1,INDEX2-INDEX1-1) AS INT)*100
+CAST(SUBSTRING(ProcessName,INDEX2+1,INDEX3-INDEX2-1) AS INT)
AS Sort
FROM
(
	SELECT ProcessName
	,CHARINDEX('.',ProcessName) AS INDEX1
	,CHARINDEX('.',ProcessName,CHARINDEX('.',ProcessName)+1) AS INDEX2
	,CHARINDEX('.',ProcessName,CHARINDEX('.',ProcessName,CHARINDEX('.',ProcessName)+1)+1) AS INDEX3
	FROM ProcessPublish
) AS table1
ORDER BY Sort ASC

結果如下圖:


優化程式碼:字串中沒有三個.,排序序號設定為0

USE [Test]
GO

SELECT 
ProcessName
,INDEX1
,INDEX2
,INDEX3
,CASE WHEN INDEX1>0 AND INDEX2>0 AND INDEX3>0 THEN--判斷是否字元中包含3個.
	CAST(SUBSTRING(ProcessName,0,INDEX1) AS INT)*10000
	+CAST(SUBSTRING(ProcessName,INDEX1+1,INDEX2-INDEX1-1) AS INT)*100
	+CAST(SUBSTRING(ProcessName,INDEX2+1,INDEX3-INDEX2-1) AS INT)
ELSE 0 END
AS Sort
FROM
(
	SELECT ProcessName
	,CHARINDEX('.',ProcessName) AS INDEX1
	,CHARINDEX('.',ProcessName,CHARINDEX('.',ProcessName)+1) AS INDEX2
	,CHARINDEX('.',ProcessName,CHARINDEX('.',ProcessName,CHARINDEX('.',ProcessName)+1)+1) AS INDEX3
	FROM ProcessPublish
) AS table1
ORDER BY Sort ASC