Упорядочить буквенно-цифровые значения по номерам - PullRequest
1 голос
/ 15 апреля 2019

У меня есть таблица с одним столбцом со следующими значениями.

|TestId|
--------
| F1   |
| F2   |
| F3   |
| A62  |
| F9   |
| DP45 |
| CAP78|
| F89  |
| F34  |
| F43  |

Мне нужно заказать их на основе их числовых частей.Так что в основном мне нужно получить

F1, F2, F3, F9, F34, F43, DP45, A62, CAP78, F89

Я пробовал приведенный ниже запрос, но получил неправильные результаты.

SELECT [TestId] FROM TestingOrder 
ORDER BY LEN(TestId),TestId

Я получаю F1, F2, F3, F9, A62, F34, F43, F89, DP45, CAP78, что не то, что я хочу.

Как мне исправить это, чтобы получить заказНужен?

РЕДАКТИРОВАТЬ: Ответ предоставлен работает, если нет повторяющихся значений.Однако происходит сбой при наличии повторяющихся значений

Например:

|TestId|
--------
| F1   |
| F2   |
| F3   |
| A62  |
| F9   |
| DP45 |
| CAP78|
| F89  |
| F34  |
| F43  |
| F1   |
| F3   |
| F89  |
| F34  |

Я изменил ответ на этот

select TestId FROM  
(SELECT DISTINCT TestId From TestingOrder) A
cross apply
( values ( convert(int,(substring(TestId, patindex('%[0-9]%', TestId), len(TestId))))) )tt(nos)  
order by nos;

Результат изменится на F1, F2, F3,F34, F43, DP45, A62, CAP78, F89, F9

1 Ответ

5 голосов
/ 15 апреля 2019

Вы можете использовать patindex():

select distinct t.*
from TestingOrder t cross apply
     ( values ( convert(int, substring(TestId, patindex('%[0-9]%', TestId), len(TestId)))) 
     ) tt(nos)
order by tt.nos;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...