[英]Sort the Alphanumeric column in SQL
我想對 SQL 服務器中的以下字母數字列進行排序。
Column A
------------------------------
SP-SS-2
SP-FAB-8
WD-1
WD-4A
WD-11
WD-10
WD-2
WD-20
我想按升序排序 Output 如下:
Column A
-----------------------
SP-FAB-8
SP-SS-2
WD-1
WD-2
WD-4A
WD-10
WD-11
WD-20
有什么技巧可以讓它正確排序嗎?
如果我們想克服這個問題,我們需要將字符串和數字分開,然后對它們進行排序。 在第一步中,我們需要一個 function 來幫助將數字與字符串分開。 因此,我們將創建此 function 查詢以僅從字符串中獲取數字
CREATE FUNCTION dbo.udf_GetNumeric
(@strAlphaNumeric VARCHAR(256))
RETURNS VARCHAR(256)
AS
BEGIN
DECLARE @intAlpha INT
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric)
BEGIN
WHILE @intAlpha > 0
BEGIN
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '' )
SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric )
END
END
RETURN ISNULL(@strAlphaNumeric,0)
END
GO
在第二步中,我們可以執行以下查詢,這將有助於對字母數字字符進行排序。
CREATE TABLE #Temp
(Val VARCHAR(100))
INSERT INTO #Temp
VALUES ('SP-SS-2') ,
('SP-FAB-8'),
('WD-1'),
('WD-4A'),
('WD-11'),
('WD-10'),
('WD-2'),
('WD-20')
select val,dbo.udf_GetNumeric(val) as textpart
,LEFT(val,PATINDEX('%[0-9]%',val)-1) as stringpart
from
#Temp
order by LEFT(val,PATINDEX('%[0-9]%',val)-1) ,convert(int,dbo.udf_GetNumeric(val))
+----------+----------+------------+
| val | textpart | stringpart |
+----------+----------+------------+
| SP-FAB-8 | 8 | SP-FAB- |
| SP-SS-2 | 2 | SP-SS- |
| WD-1 | 1 | WD- |
| WD-2 | 2 | WD- |
| WD-4A | 4 | WD- |
| WD-10 | 10 | WD- |
| WD-11 | 11 | WD- |
| WD-20 | 20 | WD- |
+----------+----------+------------+
SELECT ColumnA FROM #TblTableA
ORDER BY
LEFT(ColumnA,PATINDEX('%[0-9]%',ColumnA)-1),
CASE
WHEN ISNUMERIC(ColumnA) = 0
THEN CAST(LEFT(RIGHT(ColumnA,LEN(ColumnA)-CHARINDEX('-',ColumnA)),
patindex('%[^0-9]%', RIGHT(ColumnA,LEN(ColumnA)-CHARINDEX('-',ColumnA))+'.') - 1) AS INT)
ELSE ColumnA
END
Output:-
ColumnA
---------
SP-FAB-8
SP-SS-2
WD-1
WD-2
WD-4A
WD-10
WD-11
WD-20
注意:-您將使用 Patindex 獲得這種類型的 output .....
有關更多信息...請按照以下鏈接https://dba.stackexchange.com/questions/117379/sort-a-varchar-type-column-alphanumeric-values
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.