Сортировать буквенно-цифровой столбец в SQL - PullRequest
0 голосов
/ 02 ноября 2019

Я хочу отсортировать приведенный ниже буквенно-цифровой столбец в SQL Server.

Column A
------------------------------
SP-SS-2  
SP-FAB-8  
WD-1  
WD-4A  
WD-11  
WD-10  
WD-2  
WD-20   

Я хочу отсортировать по возрастанию. Вывод выглядит следующим образом:

Column A
-----------------------
SP-FAB-8  
SP-SS-2  
WD-1  
WD-2  
WD-4A  
WD-10  
WD-11  
WD-20  

Любые приемы для правильной сортировки

Ответы [ 2 ]

2 голосов
/ 02 ноября 2019
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 

Вывод: -

ColumnA
---------
SP-FAB-8
SP-SS-2
WD-1
WD-2
WD-4A
WD-10
WD-11
WD-20

Примечание: - Вы получите этот тип вывода, используя Patindex .....

Для получения дополнительной информации ... Перейдите по этой ссылке ниже https://dba.stackexchange.com/questions/117379/sort-a-varchar-type-column-alphanumeric-values

2 голосов
/ 02 ноября 2019

Если мы хотим решить эту проблему, нам нужно разделить строки и числа, а затем отсортировать их. На первом этапе нам нужна функция, которая помогает отделить числа от строк. Поэтому мы создадим эту функцию Запрос для получения только чисел из строки

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-        |
+----------+----------+------------+
...