仅按字符串的数字部分排序

时间:2012-09-21 20:48:25

标签: sql sql-server-2008

我有一个名为Number的列填充了这个数据(列是nchar):

1
2
1091
3
20
2B

我想要一个提供此订单的select语句:

1
2
2B
3
20
1091

我怎么能做到这一点?谢谢大家的帮助

(修改)

3 个答案:

答案 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的另一个版本:

Natural Sort in MySQL

尚未找到任何SQL Server。

<强> EDIT3

啊,这个也涵盖了一些SQL Server的想法:

Natural Sort in MySQL

答案 2 :(得分:1)

使用PATINDEX,检查此SQL Fiddle代码。 @AaronBertrand在我测试时刚回答。

只需添加更多价值和信息,请检查this SQLServerCentral link,以便找到更多答案。

并查看此Natural (human alpha-numeric) sort in Microsoft SQL 2005,许多有用的答案和变体。