面临的问题:
现在要做一个多字段的复合范围查询,比如说下表
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语句得根据用户的选择才能决定,所以需要繁琐的判断。请教各位大神有没有其它简便的方案
现在要做一个多字段的复合范围查询,比如说下表
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语句得根据用户的选择才能决定,所以需要繁琐的判断。请教各位大神有没有其它简便的方案
解决方案 »
- 查找日期型字符串 并在该字符串前若干位置插入特殊的字符
- C#调用后台存储过程得不到结果集
- 托管c++函数类型在c#调用时发生变化
- DataGridView中使用ImageList显示图像,但是大小如何调整呢?请教高手赐教!
- DECIMAL转成DOUBLE
- 如何读取硬盘上的一张图片,在图片特定区域内叠加上另外一张图片,生成一张新图片序列化为流输出?
- 自己写的一段超时代码,大家进来瞅瞅!给点意见
- 菜鸟100分求几个关于DATAGRID的问题!
- 请问怎样使程序字体与系统主题保持一致?
- 高分寻求ChinExec或者FlexExcel的注册码!!!!(分不够可以再加)
- 应用程序关闭退出,快速释放资源的解决办法?
- 请高手指点一下,有什么编程软件有128位的long double
b between 2 and 36 and
c between 13 and 100
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控件里取
s += makeRange("a",mina,maxa);
s += makeRange("a",mina,maxa);
s += makeRange("a",mina,maxa);
string s=" and "
if(min+"" != "") s+=field+">="+min;
if(max+"" != "") s+=field+"<="+min;
return s
}
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: "";
}
我的用法 就是判断是否在comobox中是否有选择字段,如果有选择就添加
where....
接着判断 下面的就得是 and where.....这样就面临要判断SQL命令字符串中是否已经有一个where,如果有后面的添加都得加 and where请问你这种做法可以避免这种问题吗?
后面添加只添加And,不添加Where了
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: "";
}
-这类就写成存储过程吧
写一大堆参数过去,存储过程里还照样要用动态语句。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;
}