排序具有数值

时间:2017-09-27 17:39:06

标签: sql-server

我有一个包含这样数据的专栏:

COMPRESSIN 1(PB4),
COMPRESSIN 12(PB4),
COMPRESSIN 3(PB4).

我想通过COMPRESSION订购列。所以分别为1,3和12,如下图所示:

COMPRESSION 1(PB4),
COMPRESSION 3(PB4),
COMPRESSION 12(PB4).

3 个答案:

答案 0 :(得分:0)

您需要通过子字符串进行排序。

...
order by 
   substring(yourColumn,12,99)

这基本上对'COMPRESSION '之后的所有内容进行排序。重要的是要知道这仍然是基于使用unicode十进制值的varchar顺序进行排序。因此,由于它的区分大小等,b出现在A之前......

如果您的列都以(XXX)模式结束,您可以使用它来规避这一点。

order by 
   left(substring(yourColumn,12,99),len(substring(yourColumn,12,99)) - 5)

答案 1 :(得分:0)

另一种方法是在订购时删除非数字部分:

ORDER BY CAST(
          REPLACE(
           REPLACE(YourColumn, 'COMPRESSION ','')
          , '(PB4)','')
         AS int) ASC

答案 2 :(得分:0)

这是一个潜在的解决方案,或者至少有一个可以帮助您找到正确方向的解决方案。我建议您考虑问题的清晰度并添加更多细节。

SELECT
    ColumnName
FROM
    TableName
ORDER BY
    CAST(SUBSTRING(ColumnName, CHARINDEX(' ', ColumnName) + 1, CHARINDEX('(', ColumnName) - CHARINDEX(' ', ColumnName) - 1) AS int)

这可以通过使用CHARINDEX来查找压缩后的空间作为起始位置(在空格后开始+1),并使用左括号作为结束位置来隔离数字值以进行排序。您还需要将此值转换为某种类型的数值,如整数。