在SQL Server中排序字母数字列

时间:2016-07-12 07:39:56

标签: sql sql-server sql-order-by

我的数据是这样的

<400    
1000-1200    
1200-1400    
1400-1600    
1600-1800    
400-600    
600-700    
700-800    
800-1000

我想要这样

<400    
400-600    
600-700    
700-800    
800-1000    
1000-1200    
1200-1400
...

 order by   LEFT(WC.[WGHT_CLAS_DESC], PATINDEX('%[0-9]%', WC.[WGHT_CLAS_DESC])-1), 
    CONVERT(INT, SUBSTRING(WC.[WGHT_CLAS_DESC], PATINDEX('%[0-9]%', WC.[WGHT_CLAS_DESC]), LEN(WC.[WGHT_CLAS_DESC])))

这是我在SQL Server中使用但不起作用的代码

3 个答案:

答案 0 :(得分:2)

试试这个:

DECLARE @DataSource TABLE
(
    [Column] VARCHAR(32)
);

INSERT INTO @DataSource ([Column])
VALUES ('<400')
      ,('1000-1200')
      ,('1200-1400')
      ,('1400-1600')
      ,('1600-1800')
      ,('400-600')
      ,('600-700')
      ,('700-800')
      ,('800-1000');

SELECT [Column]
      ,TRY_CONVERT(INT, SUBSTRING([Column], 0, CHARINDEX('-', [Column])))
FROM @DataSource
ORDER BY TRY_CONVERT(INT, SUBSTRING([Column], 0, CHARINDEX('-', [Column])));

enter image description here

请注意,SQL Server 2012后可以使用TRY_CONVERT,因此如果您使用的是早期版本,则可以使用CAST

ORDER BY CAST(SUBSTRING([Column], 0, CHARINDEX('-', [Column])) AS INT)

答案 1 :(得分:0)

我认为你的意思是:

ORDER BY LEFT(WC.[WGHT_CLAS_DESC], PATINDEX('%[0-9]%', WC.[WGHT_CLAS_DESC])-1) DESC, 
    CONVERT(INT, SUBSTRING(WC.[WGHT_CLAS_DESC], PATINDEX('%[0-9]%', WC.[WGHT_CLAS_DESC]), PATINDEX('%[^0-9]%', WC.[WGHT_CLAS_DESC])-1))

答案 2 :(得分:0)

试试这个:

declare @t table(val varchar(max))
insert into @t
select '<400'
union select '1000-1200'    
union select '1200-1400'    
union select '1400-1600'    
union select '1600-1800'    
union select '400-600'  
union select '600-700'    
union select '700-800'    

SELECT rn=row_number() over( order by StartNumber,EndNumber),StartNumber,EndNumber Val
FROM (
    select  
            CAST(RIGHT(val,LEN(val)-CHARINDEX('-',val)) as int) EndNumber,
            CAST(REPLACE(val,'-'+RIGHT(val,LEN(val)-CHARINDEX('-',val)),'') as int) StartNumber,
            val 
    from (
           SELECT REPLACE(Val,'<','0-') As Val from @t
         ) a
)Data

当然,我建议在SQL2012之后使用TRY_CONVERT