我有一个表中有一个字段为分类号,部分数据如下:
k822.1/1:1
k822.1/1:10
k822.1/1:11
k822.1/1:12
k822.1/1:2
k822.1/1:23
k822.1/1:3
要求排序后为:
k822.1/1:1
k822.1/1:2
k822.1/1:3
k822.1/1:10
k822.1/1:11
k822.1/1:12
k822.1/1:23
k822.1/1:1
k822.1/1:10
k822.1/1:11
k822.1/1:12
k822.1/1:2
k822.1/1:23
k822.1/1:3
要求排序后为:
k822.1/1:1
k822.1/1:2
k822.1/1:3
k822.1/1:10
k822.1/1:11
k822.1/1:12
k822.1/1:23
Help me
我在线等待呢
to eagle123(孤独的鹰)
这种方法恐怕不行,因为.与/之间,/与:之间都有可能出现上面类似的情况
而且还有可能出现这样的数据:
A463/1:B0
A465/1:E29
A467/1:G03
天哪,我该怎么办啊,如果能像pb里面的数据窗口那样对数据分组就好了
如果是:
增设一个数字型字段:idint。
自己编制一个n进制的算法,将你的“分类号”字符串转换为整数存入idint。
( * n进制:据你的字符串中可能出现的字符数而定n值。)结果数据集按idint排序。
1
1
12
然后再合并
A463/1:B0
A465/1:E29
A467/1:G03
to tianyc(贝壳)自己编制一个n进制的算法,将你的“分类号”字符串转换为整数存入idint。
( * n进制:据你的字符串中可能出现的字符数而定n值。)可否举一个例字,例如A467/1:G03如何转化,n应该为几?
要分两段来排, 问题是如何把单一字段, 由尾开始, 撷取数字部份, 其馀为首字段.如果是k822.1/1:1,应该分为哪两部分
是否要将k./:作为第一部分,822111作为第二部分呢?
就可以直接用 order by 来排序。
这样比较容易解决。
例如:你的序列号中如果只可能有[0 1 2 3 4 5 6 7 8 9 A G K / . :]的出现,则n值就取为16。要将“K/8”转成整数:12*16*16+13*16+8=3288,
要将“A10G”转成整数:10*16*16*16+1*16*16+0*16+11=41227对“K/8”和“A10G”两行记录按自己转换出的整数升序排列结果则为:
“K/8” .... 3288
“A10G” .... 41227(为了减少麻烦,你最好将你的编码在存盘前转为大写。)
你再好好体会一下祝你成功!
强烈推荐!强烈推荐!强烈推荐全新的调查!
强烈推荐!强烈推荐!强烈推荐!强烈推荐全新的调查,谢谢!http://www.csdn.net/Expert/TopicView1.asp?id=655336
转换规则:将分类号中的连续的数字变为有前导0的等宽数字
以下是转换为5位宽的数字:
k822.1/1:1 => k00822.00001/00001:00001
k822.1/1:10 => k00822.00001/00001:00010
k822.1/1:11 => k00822.00001/00001:00011
k822.1/1:12 => k00822.00001/00001:00012
k822.1/1:2 => k00822.00001/00001:00002
k822.1/1:23 => k00822.00001/00001:00023
k822.1/1:3 => k00822.00001/00001:00003以下是我用过的转换函数:
function FilterDigit(const s:string; aWidth:integer):string;
const
DSet:set of char = ['0'..'9'];
var
sZero, stemp: string;
i: integer;
begin
Result := '';
sZero := StringOfChar('0', aWidth);
stemp := '';
for i := 1 to length(s) do
begin
if s[i] in DSet then
begin
stemp := stemp + s[i];
end else
begin
if stemp <> '' then
begin
stemp := sZero + sTemp;
stemp := copy(stemp, length(stemp) - awidth + 1, awidth);
Result := Result + stemp;
stemp := '';
end;
Result := Result + s[i];
end; end;
if stemp <> '' then
begin
stemp := sZero + sTemp;
stemp := copy(stemp, length(stemp) - awidth + 1, awidth);
Result := Result + stemp;
stemp := '';
end;end;调用FilterDigit('A467/1:G03', 5)就返'A00467/00001:G00003'
select substring(pformno,6,len(pformno)-6)) as tem from yourtable order by tem
好久没来了,所以一直没结贴,没想到还有这么多朋友帮忙
那个问题已经解决了,是采用类似kevincomein(白菜) 的办法,
将分类好分为四段.要是早一点看到 guig(胖胖),就会采用guig(胖胖)的办法.一会结贴