按数字部分排序字母数字值

The*_*One 1 sql-server

我有一个表,其中的一列具有以下值。

|TestId|
--------
| F1   |
| F2   |
| F3   |
| A62  |
| F9   |
| DP45 |
| CAP78|
| F89  |
| F34  |
| F43  |
Run Code Online (Sandbox Code Playgroud)

我需要根据其数字部分订购它们。所以基本上我需要

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

我尝试了以下查询,但得到了错误的结果。

SELECT [TestId] FROM TestingOrder 
ORDER BY LEN(TestId),TestId
Run Code Online (Sandbox Code Playgroud)

我得到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  |
Run Code Online (Sandbox Code Playgroud)

我修改了答案

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;
Run Code Online (Sandbox Code Playgroud)

结果更改为F1,F2,F3,F34,F43,DP45,A62,CAP78,F89,F9

Yog*_*rma 5

您可以使用use 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;
Run Code Online (Sandbox Code Playgroud)