ORDER/SORT列以字符为前缀的数字和数字

ale*_*oot 6 sql t-sql sql-server

我有一个varchar列来讨论代码,这个代码只能通过数字,或者以char作为前缀的数字,例如我有一个包含这些数据的列:

+------+
| Code |
+------+
|  1   |
|  C1  |
|  2   |
|  3   |
|  C3  |
|  F3  |
|  F1  |
|  F17 |
|  C9  |
|  C10 |
|  C47 |
| C100 |
| C134 |
| A234 |
|C1245 |
|   10 |
|  100 |
+------+
Run Code Online (Sandbox Code Playgroud)

等等 ...

我想按此规则对此列进行排序:

  1. 只有数字代码
  2. 带有字母部分顺序的带前缀代码,数字部分按数字排序

我想实现这样排序的结果集:

+------+
| Code |
+------+
|  1   |
|  2   |
|  3   |
| 10   |
| 100  |
| A234 |
|  C1  |
|  C3  |
|  C9  |
|  C10 |
|  C47 |
| C100 |
| C134 |
|C1245 |
|  F1  |
|  F3  |
|  F17 |
+------+
Run Code Online (Sandbox Code Playgroud)

如何获得按此标准订购的结果集?我尝试过这样的查询:

SELECT Code FROM Code_List ORDER BY case when Code like '%[a-z]%' then 99999999999999999999999999999999 else convert(decimal, Code) end
Run Code Online (Sandbox Code Playgroud)

但我得到一个结果,首先订购数字,然后是前缀数字,但alpha前缀数字按字母排序,而不是按照我想要的方式...

唯一的数字记录应该按照数字顺序的规则排序,而不是字符顺序,所以如果唯一的数字记录是:

+------+
| Code |
+------+
|  1   |
|  47  |
|  2   |
|  3   |
|  6   |
|  100 |
|  112 |
|  10  |
Run Code Online (Sandbox Code Playgroud)

我想得到:

+------+
| Code |
+------+
|  1   |
|  2   |
|  3   |
|  6   |
|  10  |
|  47  |
|  100 |
|  112 |
Run Code Online (Sandbox Code Playgroud)

数据库是Microsoft SQL Server.

And*_*y M 4

假设值之前没有空格,并且只能有 1 个字符的前缀:

ORDER BY
  CASE WHEN LEFT(Code, 1) BETWEEN '0' AND '9' THEN ' ' ELSE LEFT(Code, 1) END,
  CAST(STUFF(Code, 1, CASE WHEN LEFT(Code, 1) BETWEEN '0' AND '9' THEN 0 ELSE 1 END, '') AS int)
Run Code Online (Sandbox Code Playgroud)

或者,第二个标准可以重写如下:

  CAST(STUFF(Code, 1, PATINDEX('[^0-9]%', Code), '') AS int)
Run Code Online (Sandbox Code Playgroud)

PATINDEX('[^0-9]%', Code)如果在 的开头找到非数字字符,则返回 1 Code,否则返回 0。结果,STUFF要么删除 1 个字符,要么不删除,即与之前相同。