동적쿼리에서 COALESCE로

김도환·2022년 4월 15일
0

SQL

목록 보기
1/3

오늘은 개발 중 동적쿼리를 이용해서 개발해야 할 것 같은 로직이 있었다.

회사 코드에 대한 컬럼을 파라미터로 던지고 xml에서 받아서 를 써주려고 했었다.

AND #{CD} = A.CD AND A.CD IS NULL

처음 로직이다. 참 ... 생각이 없었다. 아직 신입인데 너무 성급하고 급하게 짜다보니
대강 이렇게 짜버린것이었다.

계속 NULL POINT EXCEPTION이 뜨길래 무슨 이유인가 반나절 이상을 찾아봤지만
제대로 찾지 못했다.
이후,


AND HCI.DRS_CD = {#CD}


AND A.CD IS NULL


이렇게 말도 안되는 로직도 ..........
그!러!다!가! 선임분에 도움을 받아서 제대로 파악하고 이해해서
완성을 했다. 그 결과 동적 쿼리는 필요가 없었고 이렇게 로직을 구현할 수 있었다.

AND ( COALESCE(A.CD, ' ') = ' '
OR
COALESCE(A.CD, ' ') = {#CD}
)

나는 COALESCE를 알고 있었다. 하지만 이렇게 사용하는 법은 몰랐다. 아니, 생각도 안했었다.
*COALESCE란? -COALESCE(column, NULL일 때 표출할 값(varchar or number))
COALESCE(A.CD, ' ') -> A.CD가 NULL이면 ' ' 빈 값으로 가지고 오겠다라는 뜻이다.

그리고 NULL POINT ECEPTION이 떴던 이유는 어제 수정했던 백엔드에서 구현했던 로직이다.

if (splitList.size() > 0) {
for (Cpmcbm00100_env data : splitList) {
if (data.getCtrl_clas_cd().toString().length() > 11) {

if (data.getCtrl_clas_cd().endsWith(this.getDrsCode())) {
data.setCtrl_clas_cd(this.getDrsCode());
returnList.add(data);
}
} else if (data.getCtrl_clas_cd().toString().length() <= 11) {
returnList.add(data);
}
이 구문을 디버깅 해본 결과는 처참했다.
for문부터 타지 않았다. 그래서 이 로직도 xml에서 수정해주었다.

AND (
COALESCE(A.MENU_CD, ' ') NOT LIKE ('%_A%')
OR
COALESCE(A.MENU_CD, ' ') LIKE ('%A' || #{code} || '%')
)

이렇게 다시 COALESCE를 이용해서 구현했다.
저 코드의 뜻은 A.MENU_CD가 _A를 포함하지 않았을 때와
A.MENU_CD가 A와 #{code}를 포함했을 때이다.

음... QWERT001과 QWERT001_X1234 라는 데이터가 똑같은 컬럼에 들어가 있고
_X이후에 숫자부터는 업체 고유코드이다. 그래서 다른 업체에서는 보이면 안되는 컬럼이다.
그 작업을 저렇게 처리했다.

도환아, 정신차리자.

profile
극초보 웹개발자

0개의 댓글