首页 > 解决方案 > 按数字部分排序字母数字值

问题描述

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

|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

标签: sql-server

解决方案


您可以使用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;

推荐阅读