一个sql select语句中有需要输入的变量,如何重组sql在变量输入少或者没有的情况下保证sql还是能正确执行

skyjust 2003-10-09 06:37:25
例如原来的sql为select * from db where a=:v1 and (b:=v2 or c:=v3) having e>:v4 group by zoneno

其中v1,v2,v3,v4都是需要输入的变量,可是用户可以选择其中的几个输入,为了使得没有输入的变量不影响整个sql语句
比如v1没有输入,那么语句就变为select * from db where (b:=v2 or c:=v3) having e>:v4 group by zoneno

该怎样用java重组整个sql语句???
给个思路也可以
...全文
324 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyjust 2003-10-14
  • 打赏
  • 举报
回复
我试了一下,oracle里面好像不能用select * from db where a=*这样的,后面的a=*编译通不过
to
alienbat(死灵巫师):
重载的话,对于select * from db where a=:v1 and (b:=v2 or c:=v3) having e>:v4 group by zoneno
进来一个变量的值,怎么知道哪个该置*,哪个置该值呢?
skyjust 2003-10-14
  • 打赏
  • 举报
回复
我看了一下正则,好像用正则来替换也很麻烦么,我本来想把不存在的变量语句替换成1=1,可是如果前面有or的话就不行了,不知道该怎么替换比较好
skyjust 2003-10-13
  • 打赏
  • 举报
回复
那在处理(b=* or c=*) 在其中一个变量为空的情况时,有什么好的办法么?
感觉好像很麻烦,去掉or的话,还要考虑b,c都没有输入,以及括号的问题
语法中应该不允许有select * from db where () and (b:=v2 or :v2 is null) group by zoneno中的括号()这样的情况吧

Lastdrop 2003-10-13
  • 打赏
  • 举报
回复
SQL语句可以这样:
select * from db where (a=:v1 or :v1 is null) and (b:=v2 or :v2 is null) or (c=:v3 or :v3 is null) having (e>:v4 or :v4 is null) group by zoneno

或者
定位所有的变量位置,若变量为空,将关系符和左边的变量一起变成1=1这种等式,就可以不用操心括号之类的了,不过(b=* or c=*) 在其中一个变量为空时,不应该变为b=*或者c=*,这就不太符合逻辑了.
skyjust 2003-10-13
  • 打赏
  • 举报
回复
原来sql里面是可以用select * from db where (b=* or c=*) having e>* group by zoneno
这样的语句的??
alienbat 2003-10-13
  • 打赏
  • 举报
回复
1。先写个方法,参数个数是所有SQL语句里需要填入的变量数
2。重载此方法,参数个数小于SQL语句里需要填入的变量数,缺少的变量置为“*”然后作为参数调用前面写的方法
3。重载n次 调用此方法就能保证输入任意多参数都能生成合法的SQL语句
skyjust 2003-10-11
  • 打赏
  • 举报
回复

呵呵,可能是我没说清楚,不是针对上面这句sql,而是,拿到任意一句sql语言之后,
对其进行分析,然后将其应该输入的变量,有的就填入,没有的话,要对本来的sql语句进行增删调整,最终形成恰当的sql,
比如输入v1没有,v2为222,v3为333,v4没有则变化后的sql应该为
select * from db where (b=222 or c=333) group by zoneno

如果输入v1为111,v2为222,v3没有,v4为444则变化后的sql应该为
select * from db where a=111 and (b=222 ) having e>444 group by zoneno

原始的sql语句中需要输入变量的地方,变量前面用:表示此处需要输入,我第一条有些地方打错了,冒号应该都在=号后面


happyegg 2003-10-10
  • 打赏
  • 举报
回复
StringBuffer sBuf = new StringBuffer("select * from db where 1=1 and ");
if(v1!=null && !v1.equals(""))
sBuf.append("a=:").append(v1).append(" and ");
if( (v2!=null && !v2.equals("")) || (v3!=null && !v3.equals("")) ) {
sBuf.append("(");
if(v2!=null && !v2.equals(""))
sBuf.append("b:=").append(v2).append(" or ");
if(v3!=null && !v3.equals(""))
sBuf.append("c:=").append(v3).append(" or ") ;
sBuf.setLength(sBuf.length()-4);//Remove redundant ' or '
sBuf.append(") and ");
}
sBuf.setLength(sBuf.length()-4);// Remove redundant 'and '
if(v4!=null && !v4.equals(""))
sBuf.append("having e>:").append(v4);
sBuf.append(" group by zoneno");
System.out.println("SQL = " + sBuf.toString());
maqj 2003-10-10
  • 打赏
  • 举报
回复
试一下逐个判断,逐个加入,最后达到动态生成的目的。
skyjust 2003-10-10
  • 打赏
  • 举报
回复
这句是预先知道的
select * from db where a=:v1 and (b:=v2 or c:=v3) having e>:v4 group by zoneno
是要在这句的基础上改变
还要想办法去掉括号,and,or之类的
swinging 2003-10-09
  • 打赏
  • 举报
回复
一般来说是动态拼SQL语句比较简明。
当然拼的方式很多,可以做得很清爽的。
象楼上那样拼有点漏,
要是3个都是NULL,语句就有问题。
whyxx 2003-10-09
  • 打赏
  • 举报
回复
String sql = "select * from db where ";
if (a != null || !"".equals(b)) {
sql += "a=:v1";
}
if (b != null || !"".equals(b)) {
sql += "b:=v2";
}
这样不就行了,动态拼sql文

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧