SQL中到底要不要用WHERE 1=1
当遇到多个查询条件且这些查询条件都有可能为空时,常用的方法是用<isNotEmpty >标签,例如:
<select id="countMkZgt" resultClass="java.lang.Integer" parameterClass="java.util.HashMap" >
<![CDATA[
SELECT count(0) FROM (
select mz.MZID, mz.MZNUM,mz.MZTMBQ, mz.MZFZ, mz.MZBCF, mz.MZFZXL, mz.MZBQ, mz.MEBID, mz.STID, mz.NJNAME,replace(WMSYS.WM_CONCAT(mzk.WONAME),',','<br/>') WONAME
from MKZGT mz left join (select mzk.*,woname from MKZGTKWWAYINFO mzk,KWWAYINFO wo where wo.woid = mzk.woid) mzk on mzk.mzid = mz.mzid
where 1=1 group by mz.MZID, mz.MZNUM, mz.MZTMBQ, mz.MZFZ, mz.MZBCF, mz.MZFZXL, mz.MZBQ, mz.MEBID, mz.STID, mz.NJNAME
) where 1=1
]]>
<isNotEmpty prepend="and" property="mebid">
<![CDATA[mebid = '$mebid$']]>
</isNotEmpty>
<isNotEmpty prepend="and" property="njname">
<![CDATA[njname = '$njname$']]>
</isNotEmpty>
<isNotEmpty prepend="and" property="stid">
<![CDATA[stid = '$stid$']]>
</isNotEmpty>
<isNotEmpty prepend="and" property="mznum">
<![CDATA[mznum = '$mznum$']]>
</isNotEmpty>
</select>
这时候如果所有的条件都没有,那么where 1=1就没有任何意义。那么,这样写到底合不合适呢?
答案是正确编码习惯下是合适的,主要包括以下几个方面:
A:先看看不合适到底是什么原因?如下是一段截图:
B: 对A观点的对立:
无论是否有 1=1 and ,查询分析器都会估计相同的行数,从而拥有同样的执行计划,因此不影响性能;另外,现在使用的大多数数据库如mySlq、SQLserver等 在查询分析器在代数树优化阶段就把1=1 直接给过滤掉了。这个功能就是查询优化器中所谓的“Constant Folding” 。
C: 但是如果这样用不好,有可能会出现Sql注入。
D:呀不想写了
扫描二维码关注公众号,回复:
972634 查看本文章