我有一张表,其中一列具有以下值。
|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
答案 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;