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)
等等 ...
我想按此规则对此列进行排序:
我想实现这样排序的结果集:
+------+
| 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.
假设值之前没有空格,并且只能有 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 个字符,要么不删除,即与之前相同。