2017-05-09 68 views
0

说明我有了一个表:ORDER BY在Sybase

nb | label 
60 | from 2 and less 
25 | from 3 to 16 
15 | from 17 to 100 

我努力让我用查询来获取降序:

select * from table order by label desc; 

但我没有得到正确的订单,而我有以下几种:

[ { nb: 25, label: 'from 3 to 16' }, 
    { nb: 60, label: 'from 2 and less' }, 
    { nb: 15, label: 'from 17 to 100' } ] 

它认为17是1吗?我怎样才能得到正确的订单?

谢谢你的帮助

+0

提取数字部分并将其转换为整型数据类型。 – jarlh

+0

如果你可以把2和3的0面前,那么它会按你想要的方式排序。字符串根据他们遇到的第一个字符进行排序,所以3> 2> 1它不会看到它后面的7。 '来自空间匹配'的第一个方差是3,2,1,并且这个字符串正确排序。添加0或将数字转换为数字值。 – xQbert

回答

1

这是一种痛苦。最简单的是,如果您有另一列具有相同的顺序。不过,假设第二个字是不与0开始和第一个字是“从”的整数:

order by patindex('%[0-9] %', label) desc, 
     left(label, patindex('%[0-9] %', label)) desc 

这基本上找到的第一个数字的长度,并使用该在order by第一密钥。然后它按第一个数字排序。

+0

谢谢你的回答,这个答案给出了升序,但是当我把: order by patindex('%[0-9]%',label), left(label,patindex('%[0-9 ]%',label))desc它不起作用 – Jean

+0

@Jean。 。 。这两个键都需要'desc'。 –

1

快速修复,只是将其更改为:

     ...from 03 to 16' }, 
     { nb: 60, label: 'from 02 and less' }, 
     { nb: 15, label: 'from 17 to 100' } ] 

或额外的空间,而不是零:

     ...from 3 to 16' }, 
     { nb: 60, label: 'from 2 and less' }, 
     { nb: 15, label: 'from 17 to 100' } ] 

都应该你想要的方式排序。