SQL中到底要不要用WHERE 1=1

                        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 查看本文章

猜你喜欢

转载自my.oschina.net/FourierSeriesNzh/blog/1816353