科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件关于按字段排序,001与1的排序先后问题

关于按字段排序,001与1的排序先后问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

棘手的问题,关于按字段排序,001与1的排序先后问题,也许你也遇到过

作者:csdn 来源:csdn 2009年12月14日

关键字: 问答 ASP.NET

  • 评论
  • 分享微博
  • 分享邮件

棘手的问题,关于按字段排序,001与1的排序先后问题,也许你也遇到过

按一个字段排序,是字符型的,必须是字符型,因为要有父子关系等.以前我是按数字入库操作,如果按字符那种order by很显然会发生10排在9前面的问题,原因大家也知道不用我说.为了按正常排序所以我用.PadLeft(5, '0')使入库后数据按00001,00002,00003....00010,00011的形式排,这样总不会有问题了吧.但如果这样作一旦数据量到99999条就会出错,因为位数不对吗!这里还不能通过增加成6位7位来解决,所以我的问题没法解决了,有没有让字符型排序时按数字排序的规则排序.

看了一下你的描述,我觉得可以有两个字段,一个存成数字,用来进行排序,一个存成字符,用来进行父子关系定义.或者建立视图,讲一个字段编程两个字段,然后建立视图架构,给视图建索引来提高查询速度。我看了上面的方法,通过填充字符来实现排序,也不可取,只会让处理逻辑变复杂,让系统变慢,每加一个字符,orderby的时候就要多一次比较,其实多存一个数字型的字段,开销是相当小的。但相对于其他方法,查询的速度是非常高的。而且你可以单独对这个字段建索引来提高速度。 

asii值是什么时候产生的?查询的时候么?那效率就连cast都不如了,如果是保存的时候就已经转换好了,那你用什么类型来存储呢?怕是要用varchar或者nvarchar了。这么长的数据字段用来排序,貌似不太理智啊。即便你用了,那你怎么解析它779711611410512054554699111109这个asii串,你怎么给它再还原回去?如果是保存两个字段,那还不如弄个等值的int型字段好呢。 

用定长数作为前缀, 表示真实数字的位数, 后跟真实数字


比如
1位数 001?
2位数 002??
3位数 003???
....
101位数 101??????????.....
....
999位数 999?????????????????????????.......  一共 999+3位

而按照7楼的表示法,
999位数就表示为 1110999????????????????  一共是 999+3+4位,  白多出4位.


如果把前缀定为定长 4位, 那么大的数表示为  9999????????...... , 一共9999+4位,
而用通用/(或叫万能吧,不受限制的)表示就得为 111109999??????, 一共是 9999+4+5位


我们追求的不是不通限制, 而是根据自己的需要合用就好, 那么根据需要表达的最大位数,用偶的表示法应该更简单一些.


再进一步,如果使用三段法定义, 最右为原始数, 第二段为中间段,表示原始数的位数,第三段在最左边用定长,表示中间段的位数, 那么容量更大,..

这样
比如左段用两位定长,
一位数  011?
2位数  012??
三位数  013???
....
999位数 03999?????......
99999999位数0899999999??????.......

这样最大可以表示的数字, 它的数字个数是一个99位数的.... 

以此类推.

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章