마이바티스에서 <foreach> 문을 사용할 때
<foreach collection="srch_rfnd_rmrk1" item="srr" index="index" open="(" close=")" separator=",">
이런식으로 사용하는데 foreach는 다중 값을 받아 사용할 때 사용 하는 것으로
다중 값들이 ,로 되어있다면 separator의 ',' 를 기준으로 값을 잘라 item에 자른 값을 넣어 비교를 한다.
만약, 값은 운행차량,말소차량,공백으로 받았고 쿼리를
<if test='srch_rfnd_rmrk.contains("운행차량") or srch_rfnd_rmrk.contains("말소차량") or srch_rfnd_rmrk.contains("조회된 결과가 없습니다.") '> AND RMRK IN <foreach collection="srch_rfnd_rmrk1" item="srr" index="index" open="(" close=")" separator=","> <if test ='srr != "공백" and srr != "기타"'> #{srr} </if> </foreach> <if test='srch_rfnd_rmrk.contains("기타")'> OR RMRK NOT IN ('운행차량', '말소차량', '조회된 결과가 없습니다.') </if> <if test='srch_rfnd_rmrk.contains("공백") OR RMRK IS NULL </if> </if> |
이렇게 사용한다면 결과는
AND RMRK IN ( '운행차량' ,'말소차량' ) OR RMRK IS NULL |
이렇게 조회조건이 실행된다.
여기서 item은 collection인 srch_rfnd_rmrk1의 값 중 ,(쉼표)를 기준으로 자른 '운행차량', '말소차량', '공백'이 각각 따로 들어가게 되고 이 item을 하나씩 꺼내와 if 문을 비교를 한다.
그렇기 때문에 item의 명을 값을 받아오는 파라미터명과 동일하게 'srch_rfnd_rmrk'로 해버린다면, 충돌이 일어나게 된다.
ex) <foreach collection="srch_rfnd_rmrk1" item="srch_rfnd_rmrk" index="index" open="(" close=")" separator=",">
<if test='srch_rfnd_rmrk != "공백" and srch_rfnd_rmrk != "기타">
#{srch_rfnd_rmrk}
</if>
<foreach>
예시로 'srch_rmrk_rmrk'가 '운행차량,말소차량,공백,기타' 일 경우, 결과는
AND RMRK IN ( '운행차량' ,'말소차량' ) OR RMRK NOT IN ('운행차량', '말소차량', '조회된 결과가 없습니다.') |
가 실행이 된다.
위의 결과에서 공백이 빠진 이유는 foreach 문에서 쉼표를 기준으로 자른 '운행차량', '말소차량', '공백', '기타'를 각각 비교하는데
'운행차량'과 '말소차량은' <if test = 'srch_rfnd_rmrk != "공백" and srch_rfnd_rmrk != "기타"> 여기에 만족하기 때문에 IN 뒤에 들어가게 된다. 하지만 '공백'은 만족하지 않기 때문에 '기타'로 넘어가게 되고 foreach에서 만족하지 않은 기타는 밑으로 내려와
<if test='srch_rfnd_rmrk.contains("기타")'> 와 <if test='srch_rfnd_rmrk.contains("공백")'> 의 조건에서 비교를 한다.
여기서 <if test='srch_rfnd_rmrk.contains("기타")'> 에 만족하기 때문에 OR RMRK NOT IN ('운행차량', '말소차량', '조회된 결과가 없습니다.')가 실행이된다.
즉, 공백은 foreach문에 만족하지 않기 때문에 거기 끝이 난것이고 기타는 마지막에 비교를 했기 때문에 밑의 조건까지 비교할 수 있었던 것이다. 만약에 기타 뒤에 다른 값이 있었다면 'OR RMRK NOT IN ('운행차량', '말소차량', '조회된 결과가 없습니다.')' 도 실행되지 않았을 것이다.
여담으로 open="(" close=")" 를 사용하지 않는다면 IN 뒤의 괄호는 생기지 않고
separator에 "," 가 아닌 "OR"를 사용한다면, (separator="OR")
RMRK IN ('운행차량')
OR RMRK IN ('말소차량')
OR RMRK IN ('조회된 결과가 없습니다.')
이렇게 따로따로 IN 절이 사용된다.
'기타 개념 > Oracle' 카테고리의 다른 글
<if test = ‘’> (0) | 2024.12.19 |
---|---|
Choose, when, otherwise (0) | 2024.12.16 |
Union, Union All (2) | 2024.09.26 |
테이블 권환 확인 (0) | 2024.09.19 |
오라클 - 프로시저의 COMMIT (1) | 2024.09.06 |