在表1中有4个字段
在delphi中建立一个选项表
   按字段1查询
   按字段2查询
   按字段3查询
   按字段4查询
用checkbox作为个选项选中标志,若某字段被选中,则该字段参与查询,否则不参与查询。
问题是,如何从表1中取出满足符合上述条件的语句。

解决方案 »

  1.   

    自己组和
    query
    后的where 语句,
      

  2.   

    sql.add('select * from xxx where '''+trim(combobox.text)+'''='''+trim(edit1.text)+'''');
      

  3.   

    查询的字段可能组合是2^4=16种。
    加多一个整形字段5代表查询的组合。
    0001
    0011



    1111
    1表示字段被选种。
    checkbox向字段5写数据时用可OR、AND位运算,sql语句:
    select * from xxx where '''+trim(combobox.text)+'''='''+trim(edit1.text)+''' and 字段5=XXX
      

  4.   

    对,支持楼上这位朋友的方法:不过如果这样必须让4个CheckBox的Caption属性等于表中的字段名!const
      cSQLClause='Select * From Where ';
      cEqualStr=' = ';
      cAndStr=' and ';
    var
      vFieldStr1,vFieldStr2,vFieldStr3,vFieldStr4:String;
    begin
      vFieldStr1:='';
      vFieldStr2:='';
      vFieldStr3:='';
      vFieldStr4:='';
      if CheckBox1.Checked then
      begin
        vFieldStr1:=CheckBox1.Caption;
        cSQLClause:=cSQLClause+vFieldStr1+cEqualStr+FieldValue1;  //FieldValue1是具体查询时所使用的字段的值,事先已经有内容
      end;
      if CheckBox2.Checked then
      begin
        vFieldStr2:=CheckBox2.Caption;
        cSQLClause:=cSQLClause+cAndStr+vFieldStr2+cEqualStr+FieldValue2;
      end;
      //查询条件3、4和2类似处理
      with ADOQuery1 do 
      begin
        SQL.Text:=cSQLClause;
        ExecSQL;
      end;
    end;
      

  5.   

    var
      sSQL,WhereSql:string;  
    begin
      WhereSql:='';
      if checkbox1.checked then
        WhereSql:='filed1='+value1;
      if checkbox2.checked then
        if length(WhereSql)=0 then
          WhereSql:='filed2='+value2
        else
          WhereSql:=WhereSql+'and filed2='+value2
      if checkbox3.checked then
        if length(WhereSql)=0 then
          WhereSql:='filed3='+value3
        else
          WhereSql:=WhereSql+'and filed3='+value3
      if checkbox4.checked then
        if length(WhereSql)=0 then
          WhereSql:='filed4='+value4
        else
          WhereSql:=WhereSql+'and filed4='+value4
       sSQL:='SELECT * FROM TABLE '+WhereSql;
    end;
    //这样可以必免太多的if 嵌套
      

  6.   

    我的思路是如果checkbox都没有选中或者都没有选中的话就是显示所有的数据 那么方案是
    with adoquery do
    begin
    close;
    sql.add('select * from Table1 where 1=1 ');
    end;
    if checkbox1.checked= true then
    begin
    sql.add(' and 字段1=:参数 ');
    parameters.parambyname(‘参数’).value:=值
    end;
    //一下是一样的 不再详细的介绍
    if checkbox2.checked= true then
    begin
    sql.add(' and 字段2=:参数 ');
    end;
    if checkbox3.checked= true then
    begin
    sql.add(' and 字段3=:参数 ');
    end;
    if checkbox4.checked= true then
    begin
    sql.add(' and 字段4=:参数 ');
    end;
    open
    注意空格的使用 不然会引起语法错误
      

  7.   

    我也建议用这种方法,我经常也是这么做的var
      sSQL,WhereSql:string;  
    begin
      WhereSql:='';
      if checkbox1.checked then
        WhereSql:='filed1='+value1;
      if checkbox2.checked then
        if length(WhereSql)=0 then
          WhereSql:='filed2='+value2
        else
          WhereSql:=WhereSql+'and filed2='+value2
      if checkbox3.checked then
        if length(WhereSql)=0 then
          WhereSql:='filed3='+value3
        else
          WhereSql:=WhereSql+'and filed3='+value3
      if checkbox4.checked then
        if length(WhereSql)=0 then
          WhereSql:='filed4='+value4
        else
          WhereSql:=WhereSql+'and filed4='+value4
       sSQL:='SELECT * FROM TABLE '+WhereSql;
    end;
      

  8.   

    //大家都来个select * 把所有字段都加入,误会了楼主的意思吧。
    //我献上一计
    var
    strFields,strSql:string;
    begin
    strFields='';
    if checkbox1.checked then
    //把字段1加入字段表列
    strFields:=strFields + Field1 + ',';
    if checkbox2.checked then
    //把字段2加入字段表列
    strFields:=strFields + Field2 + ',';
    if checkbox3.checked then
    //把字段3加入字段表列
    strFields:=strFields + Field3 + ',';
    if checkbox4.checked then
    //把字段4加入字段表列
    strFields:=strFields + field4 + ',';
    //把字段表列的再后的;去掉
    delete(length(strFields),strFields);
    //合成sql语句
    strSql:='select '+strFields+' From '+ mytable;//字段表列为空,退出;
    if strFields='' then
    exit;//执行sql语句
    adoquery1.close;
    adoquery1.sql.clear;
    adoquery1.sql.add(strSql);
    adoquery1.open;
    end;
      

  9.   

    //大家都来个select * 把所有字段都加入,误会了楼主的意思吧。
    //我献上一计
    var
    strFields,strSql:string;
    begin
    strFields='';
    if checkbox1.checked then
    //把字段1加入字段表列
    strFields:=strFields + Field1 + ',';
    if checkbox2.checked then
    //把字段2加入字段表列
    strFields:=strFields + Field2 + ',';
    if checkbox3.checked then
    //把字段3加入字段表列
    strFields:=strFields + Field3 + ',';
    if checkbox4.checked then
    //把字段4加入字段表列
    strFields:=strFields + field4 + ',';
    //把字段表列的再后的;去掉
    delete(strFields,length(strFields),1);
    //合成sql语句
    strSql:='select '+strFields+' From '+ mytable;//字段表列为空,退出;
    if strFields='' then
    exit;//执行sql语句
    adoquery1.close;
    adoquery1.sql.clear;
    adoquery1.sql.add(strSql);
    adoquery1.open;
    end;