如何对包含数字,字符,字符的varchar列(SQL)进行排序?

时间:2009-02-12 13:35:54

标签: sql sorting

'Order by'会在

下面返回此结果
05
05/1-1
05/1-2
05/1-3
05/1-4
05/1-5
05/1-6
05/1-7
05/1
05/2-1
05/2-2
05/2-3
05/2-4
05/2
05/3
05/4

以下订单可以

05
05/1
05/1-1
05/1-2
05/1-3
05/1-4
05/1-5
05/1-6
05/1-7
05/2
05/2-1
05/2-2
05/2-3
05/2-4
05/3
05/4

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:1)

如果可能,请尝试拆分数据,以便任何数字信息都在其自己的字段中。 字段中的字符串数据和数字数据将始终产生字符串类型的数据,因此'A2'> 'A11'。

答案 1 :(得分:1)

您需要将varchar数据转换/转换为数字数据类型,然后通过对数据进行排序来执行订单。

您可能还需要拆分数据字符串,因此按caluse排序的示例可能是:

order by 
convert(int,left(columnName,2)) asc, 
convert(int,subtring(columnName,4`,2)) 

这取决于哪些字符串元素代表哪些日期组件。

有意义吗?

答案 2 :(得分:0)

更改表格并添加比较列。编写一个小程序,读取字符串并将其转换为数据库可以转换的格式。在你的情况下,DATE是一个很好的候选人,我想。

在一般情况下,使用VARCHAR列并将所有数字格式化为五个(或更多)数字(前导零/空格,即右对齐)。

之后,您可以使用比较列对数据进行排序。

答案 3 :(得分:0)

如果我是你,我会通过一个棘手的表达来命令。让我们假设在斜线之前你最多有2或3位数。如果你写:

order by case charindex('/', val)
           when 0 then convert(int, val)
           else convert(int, substr(val, 1, charindex('/', val) -1)
         end * 1000
           + case charindex('/', val)
               when 0 then 0
               else convert(float, replace(substring(val, 1 + charindex('/', val),
                                                     length(val)), '-', '.'))
             end

如果我没有错误输入任何内容,以下内容应该将05转换为5000,05 / 1至5001,05 / 1-1至5001.1,并且应该按照您想要的方式进行排序,假设您始终只有一位数字连字符后最多。否则你可以通过使用适当数量的零分割和左边填充来解决它,但表达式会变得更加丑陋......