输入:Str1(一个字符串变量), Str2(一个字符串变量) 返回一个字符串
例如:
  Str1:='PRD_NO',Str2:='01:ABC;BCD,02:EFG;DWS'返回一个字符串作为SQL语句:
  : B.PRD_NO In (Select PRD_NO From PRDT_DSC
 Where ((DSC_NO = '01' And DSC_REM In ('ABC', 'BCD')) or
 (DSC_NO = '02' And DSC_REM In ('EFG', 'DWS'))                         Group By PRD_NO Having Count(PRD_NO) = 2)
其中PRD_NO,PRD_DSC,DSC_NO,DSC_REM是固定的,其实就是分解str2
注意Str2里的,;:依据这三个符号了进行分解。
我现在想找个最好的算法,我写的用了100行,2个函数。
请各位帮写了好的算法,
给300分星期一结帐。

解决方案 »

  1.   

    如果可能,使用回车和=进行分解。
    Str2:
    01=ABC;BCD
    02=EFG;DWS'
    这样可以用StringList.TExt := Str2;
    然后使用Names[0] 得出'01'
    Values['01'] 得出'ABC;BCD'
      

  2.   

    我写的单元文件!
    { ÌØÉ«Ìõ¼þµÄ¸ñʽ:
    //     ÌØÉ«´úºÅ1:ÌØÉ«ÃèÊö1;ÌØÉ«ÃèÊö2;..ÌØÉ«ÃèÊön,ÌØÉ«´úºÅ2:ÌØÉ«ÃèÊö1;....;ÌØÉ«ÃèÊön
    // Êä³öΪ×éºÏºóµÄ SQL Óï¾ä, Èç:
    { ÊäÈëΪ: B.PRD_NO, '01:ABC;BCD,02:EFG;DWS'
      Êä³öΪ: B.PRD_NO In (Select PRD_NO From PRDT_DSC
                            Where ((DSC_NO = '01' And DSC_REM In ('ABC', 'BCD')) or
                                  (DSC_NO = '02' And DSC_REM In ('EFG', 'DWS'))
                            Group By PRD_NO
                            Having Count(PRD_NO) = 2)}
      //Writed by yzj 2002-9-13  ×¢Ò⣺this code is different with Moritenw's but
                                      //result is same;unit GetDscSql;interface
    Uses SysUtils,Windows,Classes;function GetDsc_Sql(PrdStr,Dscno:String):String;implementationfunction GetDscArray(ADscno,sim: String;var StringList:TStringList): integer;
    var
      Position:integer;
      LeftStr:String;
    begin
      LeftStr:=Trim(ADscno);
      if Trim(LeftStr)='' then
        begin
          Result:=0;
          Exit;
        end
      else
       begin                            //A001:B¿Í»§;A¿Í»§,A:ÄÚÈÝB
         Position:=Pos(Sim,LeftStr);
         if Position<>0 then
           begin
             while  Position>0 do
               begin
                 StringList.Add(Trim(Copy(LeftStr,1,Position-1)));
                 LeftStr:=Trim(Copy(LeftStr,Position+1,255));
                 Position:=Pos(Sim,LeftStr);
               end;
              StringList.Add(LeftStr);
           end
          else
            StringList.Add(LeftStr);
         Result:=StringList.Count;
       end;
    end;function GetDsc_Sql(PrdStr, Dscno: String): String;
    var
       B_Str:String;
       E_Str,EE_Str:String;
       A_StringList,B_StringList:TStringList;
       I:integer;
       Position:integer;
       ArrayStr:String;
       PartStr1:String;
       PartStr2:String;
       Simb:String;
       S:integer;
    begin
      A_StringList:=TStringList.Create;
      B_StringList:=TStringList.Create;
      B_Str:=PrdStr+' IN '+'( '+
         'SELECT PRD_NO FROM PRDT_DSC ';
      if  Trim(Dscno)='' then
        begin
          Result:=B_Str+' )';
          exit;
        end
      else
      begin
       Simb:=',';
       B_Str:=B_Str+' WHERE ' ;
       for i:=0 to GetDscArray(Dscno,Simb,A_StringList)-1 do
         begin
              if (I=0) then
                E_Str:=E_Str+' ( '
              else
                E_Str:=E_Str+') OR ( ';
              Simb:=';';
              ArrayStr:=A_StringList[I];
              Position:=Pos(':',ArrayStr);
              if Position=0 then
                 begin
                   PartStr1:=ArrayStr;
                   E_Str:=E_Str+'DSC_NO='''+PartStr1+''''
                 end
              else
                 begin
                   PartStr1:=Trim(Copy(ArrayStr,1,Position-1));
                   PartStr2:=Trim(Copy(ArrayStr,Position+1,255));
                   B_StringList.Clear;
                   GetDscArray(PartStr2,Simb,B_StringList);
                   E_Str:=E_Str+'DSC_NO='''+PartStr1+''''+' AND  DSC_REM IN (';
                   EE_Str:='';
                   for S:=0 to B_StringList.Count-1 do
                     begin
                        if (S=B_StringList.Count-1) then
                          EE_Str:=EE_Str+''''+B_StringList[S]+''''
                        else
                          EE_Str:=EE_Str+''''+B_StringList[S]+''''+',';
                     end;
                   E_Str:=E_Str+EE_Str+' ) ';
                end;
            end;
         end;
       Result:=B_Str+E_Str+')'+' GROUP BY PRD_NO HAVING COUNT(PRD_NO)='+inttostr(A_StringList.Count)+')';
    end;
    end.