数据表中有字段 ID 自动编号  ZF varchar(255)   SZ float;
记录:
  ID         ZF                 ZZ
  1          ABCDABCDABCDAB     35
  2          BCDBDDBCBCDBBD     
  3          DDDABCCCDBBCDDzf 中每一个字符都对应一个数值
 case zf[位置] do
  A : 2
  B : 3
  C : 1
  D : 4
 
sz 为所有字符的的数值之和.
 即记录1 中,ZZ 数值是 2+3+1+4+2+3+1+4+2+3+1+4+2+3 即 35数据量很大用循环做太慢了,请教sql语句! 望指点...

解决方案 »

  1.   

    首先写一个函数:
    create or replace function SF_GET_STRCOUNT(vc_SearchStr varchar2,vc_SeperateStr char)
           return integer is
     /*
      功能:获取用分隔符分隔的字符串数量
      作者:XXXXXX
      CreateDate:2004-02-09
      
      分隔符分隔的字符串            vc_SearchStr            varchar2
      分隔符                        vc_SeperateStr          char
      
      说明:字符串必须以分隔符结尾,因为实际返回的是分隔符数量
     */
      l_StrLen Integer;
      l_Index Integer;
      Result integer;
    begin
      l_Index := 1;
      Result := 0;
      l_StrLen := length(vc_SearchStr);
      while l_Index < l_StrLen loop
      Result := Result + 1;
      l_Index := Instr(vc_SearchStr, vc_SeperateStr, 1, Result) + 1;
      if  l_Index = 1 then
      Exit;
      end if;
       
      end loop;
      if  l_Index = 1 then
      Result := 0;
      end if;   
      return(Result);
    end SF_GET_STRCOUNT;调用方式 SF_GET_STRCOUNT(ABCDABCDABCDAB,A)select SUM(SF_GET_STRCOUNT(L.ZF,A)*M.zf_A+SF_GET_STRCOUNT(L.ZF,B)*M.zf_B+SF_GET_STRCOUNT(L.ZF,C)*M.zf_C+SF_GET_STRCOUNT(L.ZF,D)*M.zf_D) from table1 L,
    ( select decode(a.case,A,a.zf,0) zf_A,decode(a.case,B,a.zf,0) zf_B,decode(a.case,C,a.zf,0) zf_C,decode(a.case,D,a.zf,0) zf_D from table2 a
    ) Mok!
      

  2.   

    你是否可以不用abcd来表示1234呢?而直接用1234啊!
    如果这样的话你只需要在写一个函数计算类似12344321的值,这样不需将abcd来分别对应判断,可以提高速度
      

  3.   

    这是一种机器读出的字符,读出来后就是一个字符串.
     
      pdbird(老巢) 的方法是用在SQL server中吧。
     
     如果是ACCESS 呢,还有方法吗,初学SQL语句 帮帮忙吧!!
      

  4.   

    ACCESS?
    呵呵,设计者是N人啊!
      

  5.   

    呵呵,不好意思,原以为ACCESS 处理这点问题应该可以。
    但试了后循环做,大约一秒钟一百条左右。太慢了! 
    不知各位大侠试过没有!
    while not eof do
    begin
     edit;
     fieldbyname('zz').asfloat:=calc(fieldbyname('zf').asstring)//计算函数
     next;
    end;
     然后在提交。  很慢的。初级菜鸟大家来帮忙啊。 
     另外程序做的差不多了,只是这个地方难以忍受.
      

  6.   

    pdbird(老巢) 的做法还不符合要求。
     其实各个字符的数值设置是这样的:
     
                                 A  B   C   D
      1   //第一个字符           2  3   1   4
      2   //第二个字符           2  1   2   3
      3   //第三个字符           1  3   2   1 
    每个字符的数值是不一样的。
    在程序中,我把数值设置做成数组,对于每个字符的数值在数组中直接返回的。
      

  7.   

    1.首先access是支持用户自定义函数的(在模板里)
    2.使用下面的语句看是不是快点
    update table set zz=calu(zf) calu() 函数你可以在自定义函数里写.
      

  8.   

    to xhh_88(三友) :
     
     access自定义函数如何写啊,有没有例子参考一下,我也想知道!谢谢!!!
      

  9.   

    我没有装access,没法给你说得更清楚,我只知道在模块里设置自定义!
    你可以到access版去问一下.
      

  10.   

    先把ZF 全部从数据库里读出来
    顺便也要把对应的id读出在DELPHI 里做函数,把ZF作为数组处理,然后把转化的值一起插回去(不插入ZF,而是ZZ,根据ID判定)不知道会不会快点也就是说 字符的转化有DELPHI 来直接处理,与数据库无关。
      

  11.   

    楼上的方法我也试过,速度能提高一倍,但最终还是不如sql语句来的快啊。
    帮帮忙啊!!  谢谢!