使用数字字符对varchar数据类型进行排序

时间:2013-12-12 12:08:42

标签: sql sql-server sql-server-2005

SQL SERVER 2005 SQL排序:

数据类型varchar

应按

排序
1.aaaa
5.xx
11.bbbbbb
12
15. 

如何获得此排序顺序

错误

1.aaaa
11.bbbbbb
12
15.
5.xx

3 个答案:

答案 0 :(得分:1)

在Oracle上,这可行。

SELECT
  *
FROM
  table
ORDER BY
  to_number(regexp_substr(COLUMN,'^[0-9]+')),
  regexp_substr(column,'\..*');

答案 1 :(得分:1)

你可以通过根据句号左侧的内容('。')计算一列来实现这一目的。

然而,除非你可以对字符串的内容做出很多断言,否则这种方法很难在生产系统中使用得足够强大。

同时处理没有句号的字符串可能会导致一些悲伤

with r as (
select '1.aaaa' as string
union select '5.xx'
union select '11.bbbbbb'
union select '12'
union select '15.' )

select *
from r
order by 
    CONVERT(int, left(r.string, case when ( CHARINDEX('.', r.string)-1 < 1) 
                                     then LEN(r.string) 
                                     else CHARINDEX('.', r.string)-1 end )), 
    r.string

答案 2 :(得分:0)

如果所有条目都有此表单,您可以将它们分成两部分并对它们进行排序,例如:

ORDER BY 
    CONVERT(INT, SUBSTRING(fieldname, 1, CHARINDEX('.', fieldname))), 
    SUBSTRING(fieldname, CHARINDEX('.', fieldname) + 1, LEN(fieldname))

这应该对.之前的部分进行数字排序,对.之后的部分进行字母数字排序,但可能需要进行一些调整,因为我还没有尝试过。< / p>

另一种方式(也就是更快)可能是创建包含.之前和.之后的部分并按其排序的计算列。

第三种方法(如果你不能创建计算列)可能是在表上创建一个视图,该视图有两个附加列和字段的相应部分,然后在该视图上执行选择。