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
解决方案
您可以使用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;
推荐阅读
- regex - 正则表达式匹配除此正则表达式之外的所有内容
- mysql - MySql 列出 sum > 0 的所有字段
- loops - 循环有一个生命周期是什么意思?
- xml - HyperJAXB3 - 解析 XSD,包括 xs:any 通配符
- html - 边框动画关键帧/CSS动画
- c# - 获取多维数组中的特定整(0)维(C# UNITY)
- coldfusion - Coldfusion 从 UNIX 转换为人类可读的时间,而不转换时区之间的时间
- android - 在 Jitpack 上发布库失败
- angularjs - 如何在 AngularJS 应用程序中集成 CCAvenue 支付网关
- javascript - 如何仅在加载元素后触发事件?