기존에 작성되어 있던 쿼리를 개선하면서 Oracle, PostgreSQL 의 문법에 약간씩 차이가 있는걸 정리해보았다.
LEFT JOIN TSOL_CO_CPTY_ROL_SFS ROL
Oracle에서는 LEFT JOIN을 사용하여 테이블을 조인함
LEFT OUTER JOIN을 명시적으로 사용해도 되지만, LEFT JOIN만 사용해도 동일하게 동작함
LEFT OUTER JOIN TSOL_CO_CPTY_ROL_SFS ROL
LEFT JOIN을 사용할 수 있지만, 명확하게 LEFT OUTER JOIN을 명시하는 경우가 많음AND BSC.CPTY_NO LIKE TO_CHAR(#{cptyNo, jdbcType=NUMERIC}) || '%'
Oracle에서는 LIKE 연산을 사용할 때, 숫자 타입을 TO_CHAR로 변환해야 함
숫자 값을 직접 LIKE와 함께 사용하면 "문자가 부적합합니다" 오류가 발생할 수 있음
AND BSC.CPTY_NO LIKE #{cptyNo, jdbcType=NUMERIC} || '%'
Oracle: TO_CHAR(숫자컬럼) LIKE '값%' 필요
PostgreSQL: 숫자컬럼 LIKE '값%' 가능 (자동 변환)
NVL(ROL.CPTY_ROL_TC, '10')
NVL을 사용하여 NULL 값을 기본값으로 대체함COALESCE(ROL.CPTY_ROL_TC, '10')
COALESCE를 사용하여 NULL 값을 기본값으로 대체함Oracle → NVL(컬럼, 기본값)
PostgreSQL → COALESCE(컬럼, 기본값)
AND NLSSORT(BSC.CPTY_NM, 'NLS_SORT = BINARY_CI')
LIKE NLSSORT('%' || #{cptyNm, jdbcType=VARCHAR} || '%', 'NLS_SORT = BINARY_CI')
Oracle에서는 대소문자를 구분하지 않는 비교를 위해 NLSSORT를 사용해야함
NLS_SORT = BINARY_CI 옵션을 적용해야 LIKE 검색이 대소문자를 무시하고 수행됨
AND UPPER(BSC.CPTY_NM) LIKE '%' || UPPER(#{cptyNm, jdbcType=VARCHAR}) || '%'
Oracle → NLSSORT(컬럼, 'NLS_SORT = BINARY_CI')
PostgreSQL → UPPER(컬럼)
BSC.CPTY_NM LIKE '%' || #{cptyNm, jdbcType=VARCHAR} || '%'
Oracle과 PostgreSQL 모두 || 연산자를 사용하여 문자열을 연결함
PostgreSQL에서는 CONCAT() 함수를 사용할 수도 있음
Oracle & PostgreSQL → 컬럼 || '문자열'
PostgreSQL 추가 기능 → CONCAT(컬럼, '문자열') 가능
AND BSC.VRS = #{vrs, jdbcType=NUMERIC}
NUMERIC 타입을 사용할 때 NUMBER 타입과 자동 변환됨AND BSC.VRS = #{vrs, jdbcType=NUMERIC}
PostgreSQL에서는 NUMERIC과 INTEGER 타입을 구분해야함
::NUMERIC과 같은 명시적 형변환이 필요할 수도 있음
Oracle → NUMBER 타입을 자동 처리
PostgreSQL → NUMERIC과 INTEGER를 구분하여 처리
| 차이점 | Oracle | PostgreSQL |
|---|---|---|
| LEFT JOIN 문법 | LEFT JOIN | LEFT OUTER JOIN 가능 |
| LIKE 연산자와 숫자 | TO_CHAR(숫자) LIKE '값%' | 숫자 LIKE '값%' 가능 |
| NULL 처리 함수 | NVL(컬럼, 기본값) | COALESCE(컬럼, 기본값) |
| 대소문자 무시 검색 | NLSSORT(컬럼, 'NLS_SORT = BINARY_CI') | UPPER(컬럼) LIKE UPPER(값) |
| 문자열 연결 | 컬럼 || '문자열' | 컬럼 || '문자열' CONCAT(컬럼, '문자열') 가능 |
| 숫자 타입 (NUMERIC) | NUMBER 자동 처리 | NUMERIC과 INTEGER 구분 필요 |