반응형
<foreach>
collection 인자(Map, Array, List, Set 등..) 값으로 반복적인 SQL 구문을 작성하기 위해 사용된다. (OR 또는 IN 구문에서 주로 사용된다.)
foreach는 6개의 속성이 있다.
- collection - 전달받은 인자 (Map, Array, List, Set등과 같은 객체)
- item - collection 속성에서 전달받은 인자값을 alias명으로 대체
- open - 해당 구문이 시작될 때 삽입할 문자열
- close - 해당 구문이 종료될 때 삽입할 문자열
- separator - 반복되는 구문 사이에 삽입할 문자열 (구문을 분리하기 위한 문자)
- index - 반복되는 구문 번호. 0부터 순차적으로 증가
예제
a, b, c가 담겨 있는 list가 있고, 해당 list에 해당하는 값을 구하고자 할 경우
SELECT
name, type, value
FROM sample
WHERE 1 = 1
AND region = #{region}
<foreach collection="valueList" item="type" open="(" close=")" separator="or">
type = #{type}
</foreach>
난 선택한 조건에 해당하는 월별 통계를 구하기 위해 <foreach> 태그를 사용했다. (oracle, tibero 쿼리)
<foreach collection="monthArr" item="item" separator=" , " open = "," close="" >
SUM(NVL(CASE WHEN B.DATE_ =#{item} THEN B.CNT END, 0))
</foreach>
monthArr에는 사용자가 선택한 조건이 담겨있는데
예를 들어 아래와 같이 조건을 입력하고 조회를 했다면 monthArr에는 2021-11, 2021-12, 2022-01 데이터가 담겨 있다.
그리고 로그를 보면 아래와 같이 쿼리가 실행된 것을 볼 수 있다.
, SUM(NVL(CASE WHEN A.DATE_ = '2021-11' THEN A.CNT END, 0)) AS "2021-11"
, SUM(NVL(CASE WHEN A.DATE_ = '2021-12' THEN A.CNT END, 0)) AS "2021-12"
, SUM(NVL(CASE WHEN A.DATE_ = '2022-01' THEN A.CNT END, 0)) AS "2022-01"
open 속성에 콤마를 작성했기 때문에 반복문의 첫 시작이 콤마로 시작되었고, 반복문을 구분하는 속성인 separator은 콤마로 작성했기 때문에 반복문의 사이에 콤마가 있다.
그리고 close 속성은 아무값도 세팅하지 않아서 반복문의 끝에 아무 데이터도 없다.
728x90
반응형
'개발 > MyBatis' 카테고리의 다른 글
[MyBatis] 변수 사용시 #{value}, ${value}의 차이 (1) | 2021.11.30 |
---|
댓글