`
mwei
  • 浏览: 121826 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

sql的where里动态拼接条件

    博客分类:
  • db
阅读更多
以前用过iBatis,她的动态拼接sql功能在多条件查询时使用很方便;
如果必须在一个sql的where里动态拼接一个条件,怎么做呢?
先看看pl/sql伪代码(不用具体考虑其应用场景):
if 状态='1' then 			--状态为'1'时,where里要加入:结束时间>离开时间 
	结束时间>离开时间    
else 						--否则,where里要加入:结束时间<当前时间
	结束时间<当前时间
end if;

如果sql硬编码在程序里,可能会用if...else...拼接一下;
可惜,这里不行,只能写在where里,一个完整sql;
不知道oracle有没有一些变态函数支持简洁做法,就看看下面的写法:
SELECT * FROM TEST_TABLE TT
WHERE ( TT.END_TIME>(CASE WHEN TT.STATUS='1' THEN TT.LEAVE_TIME ELSE NULL END) 
		OR
		TT.END_TIME<(CASE WHEN TT.STATUS='1' THEN NULL ELSE SYSDATE END)
	  )

TT.STATUS='1'时,where里(TT.END_TIME>TT.LEAVE_TIME OR FALSE),即:TT.END_TIME>TT.LEAVE_TIME
TT.STATUS<>'1'时,where里(FALSE OR TT.END_TIME<SYSDATE),即:TT.END_TIME<SYSDATE;
这里就是根据字段与NULL比较返回false来做到的(小心JS里的trap),偶尔一个条件还好说,条件多了就爽歪歪了。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics