Если мы хотим решить эту проблему, нам нужно разделить строки и числа, а затем отсортировать их. На первом этапе нам нужна функция, которая помогает отделить числа от строк. Поэтому мы создадим эту функцию Запрос для получения только чисел из строки
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- |
+----------+----------+------------+