기타 개념/Oracle

<foreach collection=“”>

워제하 2024. 12. 19. 15:43

 

마이바티스에서 <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