在MSSQL中对包含数字的字符串列进行排序?

时间:2013-12-15 07:18:10

标签: sql-server string numbers columnsorting

我遇到与以下链接中描述的问题相同的问题:

Sorting string column containing numbers in SQL?

我有一个字符串列,其数字数据在列的开头和结尾都有空格,我需要对其进行排序。

我找到的解决方案(在MySQL中)是:

SELECT * 
  FROM data 
 ORDER BY left(st,LOCATE(st,' ')), 
          CAST(SUBSTRING(st,LOCATE(st, ' ')+1) AS SIGNED)

我的问题是这个解决方案是否是最佳的,如果我将其转换为Mssql并在超过100.000条记录的表上运行它,则不会产生巨大的负载。

另外请建议我转换为Mssql,因为我对mssql不太熟悉。

由于

3 个答案:

答案 0 :(得分:1)

上述MySQL查询的SQL Server版本可能看起来像

SELECT *
  FROM table1 
 ORDER BY LEFT(name, CHARINDEX(' ', name)),
          CAST(RIGHT(name, LEN(name) - CHARINDEX(' ', name) + 1) AS INT)

这是 SQLFiddle 演示

我们从未见过您的示例数据,但如果您只有数值,该列中有前导和/或尾随空格,那么您可以这样做

SELECT *
  FROM table1
 ORDER BY CAST(name AS INT)

这是 SQLFiddle 演示

答案 1 :(得分:0)

您可能会遇到一些性能问题,即ORDER BY子句不会利用您可能定义的索引。

我的建议是将该列拆分为2列,并将ORDER BY子句更改为一个简单的:

ORDER BY Name1, Name2

为了保持应用程序代码不变,您可以添加computed column

ALTER TABLE <tablename> ADD Name AS Name1 + ' ' + Name2

答案 2 :(得分:0)

您可以简单地使用RTRIMLTRIM

SELECT * 
FROM data 
ORDER BY RTRIM(LTRIM(st))

另一种解决方案是REPLACE列中的所有空格,如下所示:

SELECT * 
FROM data 
ORDER BY REPLACE(st,CHAR(32),'')