回 帖 发 新 帖 刷新版面

主题:index建独立索引

如图表,用index命令建立独立索引,想先按XM升序,姓名相同再按SX降序 在命令窗口输入以下代码
index on xm-str(sx) to cjb 不能实现
请指点一下为什么 
在线等,谢谢
没人回答,还是大家不屑回答?帮帮小弟,等的瞌睡的顶不住了。。。#52

回复列表 (共2个回复)

沙发

应该是index on xm+str(sx) tag cjb,但这个只能用一次,下一次就应该用SET ORDE TO CJB了。index on xm+str(sx) tag cjb这个处理命令还是在命令状态下搞完好,在程序里用SET ORDE TO CJB就方便了。

板凳

用index命令建立独立索引,并且用了命令
index on xm-str(sx) to cjb 

嗯,命令看起来正确,至少从语法上看来是这样。不过建了索引之后,你一定看到的是刘志超的Sx是123的那条记录在Sx是145的那条记录前面,没有按照你的想法:先按XM升序,姓名相同再按SX降序。

先就事论事解决问题,给个正确命令:
index on xm-str(500-sx) to cjb

带点技巧,那个500是个不小于sx字段所能填写的最大数值的一个数。换句话(可以看出你的表是成绩表,sx应该是数学成绩),假如数学成绩满分150,那就用一个不小于150的数,比如150或者180等等都可以,这里我用了500。

-------------------------想知道为什么,继续看下面,否则就不用看了,呵呵。

为什么???道理很简单,这首先涉及到字符串比较。知道字符串怎样比较大小请跳过下面一段。

"123"和"145"比哪个大?当然"145"大,这并不是因为数值145比123大。看看"90"和"145"比,反而是"90"大。字符串比较是按字符先后依次比较ASCII码,同位置字符哪个ASCII码大,哪个字符串就大。所以"123"和"145"比较时,先拿两个字符串的第一字符比较,都是"1",大小相同。那就再看第二字符,一个是"2",一个是"4",当然后者的ASCII码大,所以大小已经见分晓,不再管后面还有多少字符,于是"145"比"123"大。再看"90"和"145"比,第一字符"9"比"1"大,所以"90"比"145"大。继续看"x90"和"145"比大小(注意,这里我用x代表空格),结论是"145"比"x90"大,因为"1"的ASCII码比空格的ASCII码大。小结:两个数值转换为字符串,要想字符串比大小和原先数值比大小一致,应该使两个字符串的字符按原先数值的数位对齐,位数小的前面加空格。你使用了STR()函数,不错,它返回10个字符的字符串,并且高位补空格,完全满足上面小结所说的。

再看你的命令index on xm-str(sx) to cjb,不管372十1,这命令的意思是用表达式xm-str(sx)的值做升序排列。为了简单起见,我们单单拿刘志超的两条记录来看,表达式xm-str(sx)得到的两个值分别是
"刘志超xxxxxxx123"和"刘志超xxxxxxx145"(注意,这里我用x代表空格,并且我假设姓名字段xm宽度是6,这个假设不影响问题的解释,换句话xm宽度大于6也无所谓)。这两个字符串在其中的"1"之前包括"1"都是相同的,那就要比较后面的字符大小了,显然"刘志超xxxxxxx145"大,按照升序,对应的记录当然在后。于是你就看到“不能实现”。

接下来技巧就来了,index on xm-str(sx) to cjb不能实现你的想法,它实现了:先按XM升序,姓名相同再按SX升序。那就有个想法产生,要是原来大的数值能转换为小的字符串,反之,原来小的数值能转换为大的字符串,不就行了。很好,所以我用了500-sx实现这一想法。

瞧,OK了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册