C# 使用SQL Server/C进行字母数字排序#
我有字母数字。在通过SQL ServerC# 使用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
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;