我有一个名为Number
的列填充了这个数据(列是nchar):
1
2
1091
3
20
2B
我想要一个提供此订单的select语句:
1
2
2B
3
20
1091
我怎么能做到这一点?谢谢大家的帮助
(修改)
答案 0 :(得分:18)
在发现第一个非数字的位置后,您可以通过转换为数字来执行一些技巧。在末尾附加一个随机字符会使所有字符串都相同,即使原始字符串不包含字母。
SELECT [Number] FROM dbo.TableName
ORDER BY CONVERT(INT, LEFT(Number, PATINDEX('%[^0-9]%', Number + 'z')-1));
答案 1 :(得分:1)
您正在寻找的是 NATURAL SORT ,这与大多数系统提供的常规排序不同。我在Stack Overflow上找到了一些帖子,涵盖了各种流行SQL引擎中的自然排序,包括一个关于SQL Server
的简短讨论。
这里的想法可能会让你开始解决问题。
Oracle: How can I implement a "natural" order-by in a SQL query?
您可能必须更改SQL引擎的语法。
找到了MYSQL的另一个版本:
尚未找到任何SQL Server。
<强> EDIT3 强>
啊,这个也涵盖了一些SQL Server的想法:
答案 2 :(得分:1)
使用PATINDEX,检查此SQL Fiddle代码。 @AaronBertrand在我测试时刚回答。
只需添加更多价值和信息,请检查this SQLServerCentral link,以便找到更多答案。
并查看此Natural (human alpha-numeric) sort in Microsoft SQL 2005,许多有用的答案和变体。