AND 조건이 난무하는 쿼리가 있었다.
SELECT *
FROM EMP
WHERE 1=1
<dynamic>
AND …
<isNotEmpty property=“…”>
AND …
</isNotEmpty>
</dynamic>
이 쿼리에 OR조건이 사용되어야하는 요구사항을 받게 되었다.
특정 도시가 고향이거나 그 도시에 거주하고 있는 직원 데이터 조회하는 기능을 만들어달라는 요구라고 하자.
다이나믹 태그를 이용해서 짜보았다.
SELECT *
FROM EMP
WHERE 1=1
<dynamic>
AND …
<isNotEmpty property=“…”>
AND …
</isNotEmpty>
<isNotEmpty property=“cityName” prepend=“AND” open=“(“ close=“)”>
<isEqual preperty=“residenceYn” comparevalue=“Y” prepend=“OR”>
RESIDENCE = #cityName#
</isEqual>
<isEqual preperty=“hometownYn” comparevalue=“” prepend=“OR”>
HOMETOWN = #cityName#
</isEqual>
</isNotEmpty>
</dynamic>
다이나믹 조건을 모두 만족한다면 이런 쿼리가 실행된다.
SELECT *
FROM EMP
WHERE 1=1
AND …
AND …
AND (OR RESIDENCE = #cityName#
OR HOMETOWN = #cityName#
);
오류가 났다.
6번라인의 ‘AND(‘ 다음 오게되는 ‘OR’ 이 원인이었다.
OR 앞에 1=0라는 거짓조건을 고정으로 넣어주어서 해결했다.
(참고로 거짓조건 대신 참조건 1=1을 넣으면 전체 데이터 조회가 되어버린다.)
SELECT *
FROM EMP
WHERE 1=1
<dynamic>
AND …
<isNotEmpty property=“…”>
AND …
</isNotEmpty>
<isNotEmpty property=“cityName” prepend=“AND” open=“(“ close=“)”>
1=0
<isEqual preperty=“residenceYn” comparevalue=“Y” prepend=“OR”>
RESIDENCE = #cityName#
</isEqual>
<isEqual preperty=“hometownYn” comparevalue=“” prepend=“OR”>
HOMETOWN = #cityName#
</isEqual>
</isNotEmpty>
</dynamic>
다이나믹 조건을 모두 만족하면 이런 쿼리가 실행된다.
SELECT *
FROM EMP
WHERE 1=1
AND …
AND …
AND (1=0
OR RESIDENCE = #cityName#
OR HOMETOWN = #cityName#
);
성공!