C# 使用SQL Server/C进行字母数字排序#

C# 使用SQL Server/C进行字母数字排序#,c#,sql-server,C#,Sql Server,我有字母数字。在通过SQL ServerORDER BY子句应用排序后,我得到以下结果 select * from WO where WOCode = AnyNumber order by [ColumnName] 结果: 39660A1 39660A10 39660A11 39660A2 39660A3 39660A4 39660A5 39660A6 39660A7 39660A8 39660A9 要求的结果 39660A1 39660A2 39660A3 39660A4 39660A5

我有字母数字。在通过SQL Server
ORDER BY
子句应用排序后,我得到以下结果

select * 
from WO
where WOCode = AnyNumber
order by [ColumnName]
结果:

39660A1
39660A10
39660A11
39660A2
39660A3
39660A4
39660A5
39660A6
39660A7
39660A8
39660A9
要求的结果

39660A1
39660A2
39660A3
39660A4
39660A5
39660A6
39660A7
39660A8
39660A9
39660A10
39660A11

下面是一个快速而肮脏的解决方案:

SELECT *
FROM table 
ORDER BY LEN(Field) ASC, Field ASC

演示。

假设字母
A
始终位于同一位置,且后面的字符仅为整数

然后你可以这样做:

WITH CTE AS
(
    SELECT 
        WOCode,
        CAST(SUBSTRING(WOCode, CHARINDEX('A', WOCode) + 1, 
                       LEN(WOCode) - CHARINDEX('A', WOCode) + 1) AS INT) AS DisplayOrder
    FROM 
        WO
) 
SELECT * 
FROM CTE
ORDER BY DisplayOrder;

结果:

|   WOCode |
|----------|
|  39660A1 |
|  39660A2 |
|  39660A3 |
|  39660A4 |
|  39660A5 |
|  39660A6 |
|  39660A7 |
|  39660A8 |
|  39660A9 |
| 39660A10 |
| 39660A11 |
您还可以使用以避免由于对非整数值使用cast而可能导致的错误(感谢@zambonee的建议):


By
通过SQL server排序
您是指
ORDER By
子句吗?你在找C#答案还是SQL答案?你试过什么?我们从哪里开始?是的,我指的是按条款订货。SQL或C#一切都很好,仍然没有什么进展-正在排序什么?你会想研究自然排序-这里有很多很好的答案,你使用的SQL语句在哪里?我更新了我的问题,我试图加粗39660A10和39660A11
WITH CTE AS
(
    SELECT 
        WOCode,
        CASE 
           WHEN TRY_CAST(WOCode AS INT) IS NULL 
              THEN CAST(SUBSTRING(WOCode, 
                          CHARINDEX('A', WOCode) + 1, 
                          LEN(WOCode) - CHARINDEX('A', WOCode) + 1) AS INT) 
              ELSE 0 
        END AS DisplayOrder
    FROM  
        WO
) 
SELECT * 
FROM CTE
ORDER BY DisplayOrder;