简体   繁体   English

在SQL Server中对字母数字列进行排序

[英]Sort Alphanumeric column in SQL Server

My data is in this way 我的数据就是这样

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

And I want this way 我想这样

<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])))

This is the code I have used in SQL Server but its not working 这是我在SQL Server中使用过的代码,但无法正常工作

Try this: 尝试这个:

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])));

在此处输入图片说明

Note, that TRY_CONVERT is available after SQL Server 2012 , so if you are using earlier version you can use CAST : 请注意, TRY_CONVERTSQL Server 2012之后可用,因此,如果您使用的是早期版本,则可以使用CAST

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

I think you mean this: 我想你的意思是:

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))

Try this: 尝试这个:

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

of course, i suggest to use TRY_CONVERT after SQL2012 当然,我建议在SQL2012之后使用TRY_CONVERT

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM