如何在SQL Server中对包含数字和字母的varchar列进行排序?

时间:2014-08-23 21:34:25

标签: sql sql-server tsql

我的varchar列包含数字(1-99999)和字母(AM0001-BF9999).

由于它有字母所以我无法将其转换为int

有没有办法可以使用grouping_id按数字(从小到大)排序此列,然后按字母(按字母顺序)排序?

谢谢..

3 个答案:

答案 0 :(得分:1)

您需要知道字段的最大长度。假设有25个字符用于说明目的,这将起作用:

select
    v
from (
    select 
        right(space(25) + v,25) as v
    from ( values
         ('1-99999')
        ,('AM0001-BF9999')
    ) data(v)
)data
order by v  

产量:

v
-------------------------
                  1-99999
            AM0001-BF9999

答案 1 :(得分:1)

您可以尝试使用ISNUMERIC功能,如下所示:

select * from test_table
order by 
     case isnumeric(test_column) 
     when 1 then convert(int,test_column)
     else 999999 end, test_column   

Sql fiddle demo

答案 2 :(得分:0)

这是您在对数据库模式进行非规范化时获得的结果 前缀和号码应分开存放 也就是说,这就是我遇到同样问题时所做的事情:

SELECT * FROM YOUR_TABLE
ORDER BY dbo.GetNumbers(YOUR_FIELD), YOUR_FIELD




Create Function dbo.GetNumbers(@Data VarChar(8000))
Returns int
AS
Begin   
    Return CAST(Left(
             SubString(@Data, PatIndex('%[0-9.-]%', @Data), 8000), 
             PatIndex('%[^0-9.-]%', SubString(@Data, PatIndex('%[0-9.-]%', @Data), 8000) + 'X')-1) AS int)
End

另见本文从字符串中提取数字
http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/extracting-numbers-with-sql-server/