面临的问题:
现在要做一个多字段的复合范围查询,比如说下表
      A   B   C
      12  5   85
      4   2   12
      56  18  3
要实现查询出 A在范围(13,100) AND B在范围(2,36) AND C在范围(1,36)的记录 56 18 3
(到底A,B,C哪个有范围要求 由用户指定,可能只有A有范围要求,可能A,B,C都有范围要求,如上例;范围限度同样也有用户指定)
现在我的做法:
select * from tablename where A in(min1 ,max1) and where B in(min2,max2) and where c in(min3,max3)但是由于后面的where语句得根据用户的选择才能决定,所以需要繁琐的判断。请教各位大神有没有其它简便的方案

解决方案 »

  1.   

    a between 13 and 100 and 
    b between 2 and 36 and 
    c between 13 and 100
      

  2.   

    string SQL="select   *   from   tablename   where 1=1";
    if(A条件选了)
      SQL += " AND A BETWEEN 13 AND 100"; //13,100可以从用户输入的Textbox控件里取
    if(B条件选了)
        SQL += " AND B BETWEEN 2 AND 36"; //2,36可以从用户输入的Textbox控件里取
    if(C条件选了)
        SQL += " AND C BETWEEN 1 AND 36"; //2,36可以从用户输入的Textbox控件里取
      

  3.   

    构造 where 子句吧:string s = "select * from tablename where 1=1";
    s += makeRange("a",mina,maxa);
    s += makeRange("a",mina,maxa);
    s += makeRange("a",mina,maxa);
      

  4.   

    funciton makeRange(string field,string min,string max){
    string s=" and "
    if(min+"" != "") s+=field+">="+min;
    if(max+"" != "") s+=field+"<="+min;
    return s
    }
      

  5.   

    funciton makeRange(string field,string min,string max){
        string s=" and "
        if(min+"" != "" && max+"" != ""){
          s+=field+" between "+min + " and " + max;
        }
        else{
          if(mix+"" != "") s+=field+">="+min;
          if(max+"" != "") s+=field+"<="+man;
        }
        return (s!="")?" and"+s: "";
    }
      

  6.   

    谢谢你,我现在就是这么个思路。
    我的用法 就是判断是否在comobox中是否有选择字段,如果有选择就添加
    where....
    接着判断 下面的就得是 and where.....这样就面临要判断SQL命令字符串中是否已经有一个where,如果有后面的添加都得加 and where请问你这种做法可以避免这种问题吗? 
      

  7.   

    避免了,你没看到where是写在最上面的那个SQL变量里吗?(where 1=1)
    后面添加只添加And,不添加Where了
      

  8.   


    funciton makeRange(string field,string min,string max){
        string s="";
        if(min+"" != "" && max+"" != ""){
          s+=field+" between "+min + " and " + max;
        }
        else{
          if(mix+"" != "") s+=field+">="+min;
          if(max+"" != "") s+=field+"<="+man;
        }
        return (s!="")?" and"+s: "";
    }
      

  9.   

    -不建议拼SQL
    -这类就写成存储过程吧
      

  10.   

    12楼,怎么写存储过程?
    写一大堆参数过去,存储过程里还照样要用动态语句。funciton makeRange(string field,string min,string max){
        string s="";
        if(min+"" != "" && max+"" != ""){
          makeNumBetween(field,min,max)  //自动转数字
        }
        else{
          if(mix+"" != "") s = makeNumWhere(" and field>={0}",min); //自动转数字
          if(max+"" != "") s = makeNumWhere(" and field>={0}",min); //自动转数字
        }
        return s;
    }