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

时间:2019-04-15 17:22:20

标签: sql-server

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

|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 个答案:

答案 0 :(得分: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;