界面上有不确定数目的编辑框,查询时这几个框都有可能输入资料作为查询条件,每一个框允许输入<、>、=、<=、>=等符号,请问如何组合这段sql。
最好能提供详细source

解决方案 »

  1.   

    var
      sign:string;
      fstr:string;
    begin
      case ComboBox1.ItemIndex of
        0: sign:='=';
        1: sign:='>';
        2: sign:='<';
        3: sign:=' like ';
        4: sign:='<>';
      end;
      case ComboBox1.ItemIndex of
        0,4:fstr:='select * from tabel1 where(%s%s%s) order by %s';
        19: fstr:='select * from tabel1 where(%s%s#%s#) order by %s';
      else fstr:='select * from tabel1 where(%s%s''%s'') order by %s';
      end;
      with ADOQuery1 do
      begin
        SQL.Clear;
        SQL.Add(Format(fstr,[ComboBox1.Text,sign,Edit1.Text,ComboBox1.Text]));
        Prepared;
        Open;
      end;
      

  2.   

    我是使用TStringGrid实现的
      For i:=1 to SgrdHide.rowcount-1 do
      begin
        IF SgrdHide.cells[0,i]='' THEN
           Continue;    //当为空时,跳到下循环
        Fsql:=Fsql+SgrdHide.cells[0,i];   //条件累加
        Case comSign.Items.IndexOf(SgrdHide.cells[1,i]) of
             0: Fsql:=Fsql+'='''+SgrdHide.cells[2,i]+'''';
             1: Fsql:=Fsql+'>'''+SgrdHide.cells[2,i]+'''';
             2: Fsql:=Fsql+'>='''+SgrdHide.cells[2,i]+'''';
             3: Fsql:=Fsql+'<'''+SgrdHide.cells[2,i]+'''';
             4: Fsql:=Fsql+'<='''+SgrdHide.cells[2,i]+'''';
             5: Fsql:=Fsql+'<>'''+SgrdHide.cells[2,i]+'''';
             6: Fsql:=Fsql+' LIKE '''+'%'+SgrdHide.cells[2,i]+'%'+'''';
        end;
        Case comLink.Items.IndexOf(SgrdHide.cells[3,i]) of
             0: Fsql:=Fsql+' AND ';
             1: Fsql:=Fsql+'  OR ';
        end;
        IF Pos(SgrdHide.cells[0,i],FieldName)<=0 then   //取得要排序的字段
            FieldName:=FieldName+SgrdHide.cells[0,i]+','
      End;
      Delete(Fsql,length(Fsql)-4,4);  //删除最后一个连接符号
      Delete(FieldName,length(FieldName),1); //删除最后一个逗号
      Adoquery.close;
      if Fsql<>'' then   //当FSQL不为空时
      Begin
        if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))>0)  AND   //当涵有WHERE 和不涵有GROUP BY 时
           (Pos(UpperCase('Group by'),uppercase(FDefaultSQL))<=0) then
        Begin
          Adoquery.Sql.text:=FDefaultSQL+' AND '+Fsql+' Order by '+FieldName;
        end
        Else
          if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))>0) and  //当涵有WHERE 和涵有GROUP BY 时
             (Pos(UpperCase('Group by'),uppercase(FDefaultSQL))>0) then
          Begin
            NewSql:=FDefaultSQL;
            insert(' AND '+Fsql,NewSql,Pos(UpperCase('Group by'),uppercase(FDefaultSQL)));
            Adoquery.Sql.text:=NewSql+' Order by '+FieldName;
          end
        ELSE
          if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))<=0)  AND   //当不涵有WHERE 和不涵有GROUP BY 时
             (Pos(UpperCase('Group by'),uppercase(FDefaultSQL))<=0) then
          Begin
            Adoquery.Sql.text:=FDefaultSQL+' WHERE '+Fsql+' Order by '+FieldName;
          end
        ELSE
          if (Pos(UpperCase('WHERE'),uppercase(FDefaultSQL))<=0)  AND  //当不有WHERE 和涵有GROUP BY 时
             (Pos(UpperCase('Group by'),uppercase(FDefaultSQL))>0) then
          Begin
            NewSql:=FDefaultSQL;
            insert(' Where '+Fsql,NewSql,Pos(UpperCase('Group by'),uppercase(FDefaultSQL)));
            AdoQuery.Sql.text:=NewSql+' Order by '+FieldName;
          end ;
       END
       ELSE
         Adoquery.Sql.text:=FoldSql;
       Try
         Adoquery.open;
       Except
         Showmessage('查找出错: '+AdoQuery.sql.text);
       end;
      if AdoQuery.Filtered Then
        AdoQuery.Filtered:=false;