동적 쿼리라고
where 절 조건이 붙었다 안 붙었다 하는 경우가 있어요.
StringBuilder sb = new StringBuilder(); sb.Append(" select co11, col2 \r\n"); sb.Append(" from \r\n"); sb.Append(" where 1 = 1 \r\n"); if (조건) sb.Append(" and col1 = '1' \r\n"); ~ if (조건) sb.Append(" and col2 = '2' \r\n"); ~ if (조건) sb.Append(" and col3 = '3' \r\n"); ~ if (조건) sb.Append(" and col4 = '4' \r\n");
위와 같이 조건에 따라 쿼리가 변동되는 경우죠.
이 상황에서 where 1 = 1
이 없다고 가정해보시면
조건에 따라 where 구문을 어디에 넣어야될지 난감해지는 경우가 있습니다.
그게 아니더라도
where 절 바로 뒤에 있는 조건을 지워야할 경우에도 주석처리하기가 어렵죠.
편의상 쓰는 것일 뿐 성능이나 기능상 아무런 차이도 없습니다.
저도 초보에요 이곳에서 도움 많이 받았구요 혹여나 도움이 될까해서 제 기준으로 설명 드릴게요~
화면단에 툴을 사용 하고
조건이 있을때가 잇고 없을때는 그냥 조회 할때가 있거든요~?
사용자가 조건을 선택하고 조회할때가 잇고 조건 없이 조회할때가 잇는데 이때
where 1=1 써 놓으면 하단에 바로
and 절로 붙어서 데이터가 나오는거에요
즉 조건이 where 1=1 밑에 AND 절로 계속 추가가 되는것이지요(문재인 후보님 말투...ㅋㅋ)
WHERE 1=1
AND O.CD_VENR=Z.CD_VENR(+)
#{where}
GROUP BY O.NO_SEQ
, O.DT_RECV
, O.CD_VENR
, O.FLOOR
, O.ROOM_NO
ORDER BY O.DT_RECV, O.CD_VENR
]]>
</sql>
<fragment id="where">
<if test="${not empty sFrDt}">
<![CDATA[
AND O.DT_RECV >= ${sFrDt}
]]>
</if>
<if test="${not empty sToDt}">
<![CDATA[
AND O.DT_RECV <= ${sToDt}
]]>
</if>
<if test="${not empty sShopCd}">
<![CDATA[
AND O.CD_VENR = ${sShopCd}
]]>
</if>
<if test="${not empty sFloor}">
<![CDATA[
AND O.FLOOR = ${sFloor}
]]>
</if>
</fragment>
위 소스를 보시면 알겟지만 값이 있으면 들어가는 거고 없으면 들어 가지 않는 것 이랍니다~
도움이 되었으면 합니다^^