高分征求排序解决方案 :)
设有一下字段code
//////////////////////
C.1.3.1
C.1.2.1
C
C.1.1.1
C.1.1.3
C.1
C.6
C.8
C.2
C.1.3
C.2.2
C.3
C.2.2.1.1
C.4
C.2.2.1.3
C.2.4
C.2.6
C.2.7.1
C.2.8
C.2.10
C.4.1
C.4.3
C.4.5
C.4.7
C.4.9
C.4.12
C.5.1.1
C.5.1.2
C.5.2
C.5.4
C.6.2
C.6.4
C.6.6
C.7.2
C.7.4
C.7.6
C.7.8
C.8.1
C.8.3
C.11.1
C.11.3
C.5
C.7
C.9
C.1.1
C.1.1.2
C.1.1.4
C.1.2
C.2.1
C.2.2.1
C.2.2.1.2
C.2.2.2
C.2.3
C.2.5
C.2.7
C.2.7.2
C.2.9
C.2.10
C.4.2
C.4.4
C.4.6
C.4.8
C.4.11
C.5.1
C.5.1.3
C.5.3
C.6.1
C.6.3
C.6.5
C.7.1
C.7.3
C.7.5
C.7.7
C.7.9
C.8.2
C.11
C.11.2
C.11.1.1
/////////////////////
以字母开头,比如C
第一层
C.1
C.2
...
C.9999...
C.1中分层
C.1.1
C.1.2
c.1.9999
每个节点下面都可以有无限个节点,规律同上
排序要求
C.1>C.2
C.11>C.2
c.1.11>C.12
C.1.2
如:
C.1
C.12
C.12.1
c.13
C.13.1
C.13.11
C.13.19
c.13.2
c.3
C.31...
问题点数:88、回复次数:11Top
1 楼bjwulin(开心)回复于 2001-12-26 16:32:43 得分 0
在数据库表中再增加一个字段控制层次(如001,001001,001001001,001002等)Top
2 楼c_unknower(c盲)回复于 2001-12-26 16:36:36 得分 0
我现在能基本做到正常排序
但
C.10会跑到C.9上门?:(Top
3 楼fjfzyufan(羽帆)回复于 2001-12-26 17:53:45 得分 0
考虑一下:C.01 这种格式。Top
4 楼newskysoft(阿乌)回复于 2001-12-26 18:07:28 得分 18
把c.9补0,即把所有的字段都补成特定的长度,如c.10 c.9应该这样:
c.000010
c.000009Top
5 楼c_unknower(c盲)回复于 2001-12-26 23:53:52 得分 0
这样的话那岂不是很麻烦?:(:(
而且 层数不固定
转换格式也会有困难:(Top
6 楼zjzzjzzjzzjz()回复于 2001-12-27 04:12:51 得分 0
注意,c.10与c.9当然是c.10在上面,注意是字符串比较啊!所以要达到你的效果,你可以在原有基础上稍微改动即可,即将字母部分与数字部分分开比较!
do you understand?Top
7 楼wangks777(_wskun)回复于 2001-12-27 08:57:17 得分 20
fjfzyufan(羽帆)用的方法还是比较实际的.
但如果后面跟的数字范围不大(<256)可以考虑作这样的一个映射:
"C.10.5.100"(10byte) to "C"+asc(10)+asc(5)+asc(100)(4byte)
这样既节省存储空间,便于比较排序,算法也不会复杂!
如果数字范围>256,可以考虑双字节扩展,不过映射过程复杂一些
Top
8 楼c_unknower(c盲)回复于 2001-12-28 09:09:11 得分 0
wangks777(_wskun)
能再详细点吗?
谢了:-)Top
9 楼pbdesigner(MIS/ERP开发)回复于 2001-12-28 18:51:01 得分 30
当层数不超过4时,同时具有如下格式:A.1.2.3(字符.数字.数字.数字),可按下列方法一排序.这种方法比较实用.
select code
from test
order by reverse(parsename(reverse(code),1)),
convert(float,reverse(parsename(reverse(code),2))),
convert(float,reverse(parsename(reverse(code),3))),
convert(float,reverse(parsename(reverse(code),4)))
如果要求无限层数,我提供两中解决方法供参考.
方法二:增加一个栏位,在插入触发器中调用预先写好的用于规范数据的存储过程将数据转成规范后的数据,这个存储过程不难,用规范后的栏位排序.
方法三:建一个表存储code和format_code(规范后的数据),在插入触发器中调用预先写好的用于规范数据的存储过程将数据转成规范后的数据,这个存储过程不难.每次检索要排序时进行两表的连接,以后一个表的format_code栏位排序.
这两种方法都有缺点,方法一虽有局限性,但比较实用.
Top
10 楼wangks777(_wskun)回复于 2001-12-30 09:11:21 得分 20
你干脆这样吧,在表中增加一个栏位newfield,令其等于ChangeToNEW(oldfield)
这样在select时按新栏位排序就可以达到你的要求了
ChangeToNew这个函数用于实现
"C.10.5.100" to "C"+asc(10)+asc(5)+asc(100)这样的转变
要你自已编,不需要再说了吧。。。。。?(楼上的那们方法二说的是一个意思)Top
11 楼c_unknower(c盲)回复于 2001-12-30 09:43:23 得分 0
谢谢
加分了!!
Top




