Web/SQL
[ORACLE] NVL vs IS NULL
hjkongkong
2022. 9. 22. 05:26
결론부터 말하자면 "둘 다 해보고 더 빠른 것을 선택"해야한다.
MEMBER 테이블에 존재하지 않는 파라미터(List)의 AUTH_CD 수를 반환하려한다. → OUTER JOIN 후 null count
1번 쿼리 - nvl2를 이용
2번쿼리 - WHERE절에서 IS NULL을 이용
# Mybatis, size 40인 list로 foreach문을 돈다.
1번
<select id="CodeCHK" parameterType="java.util.List" resultType="int">
SELECT
COUNT(
NVL2(B.AUTH_CD, NULL, 'CHK')
) AS AUTH_CD
from
(
< foreach collection = "list" item = "item" open = "" separator = "union" close = "" >
SELECT
#{item.AUTH_CD} AS AUTH_CD
FROM DUAL
</ foreach >
) A
LEFT OUTER JOIN MEMBER B ON A.AUTH_CD = B.AUTH_CD
</select>
2번
<select id="CodeChk" parameterType="java.util.List" resultType="int">
SELECT COUNT(A.AUTH_CD) AS AUTH_CD from (
<foreach collection="list" item="item" open="" separator="union" close="">
SELECT
#{item.AUTH_CD} AS AUTH_CD
FROM DUAL
</foreach>
) A
LEFT OUTER JOIN MEMBER B ON A.AUTH_CD = B.AUTH_CD
WHERE A.AUTH_CD IS NULL
</select>
위에서부터 1번, 2번 쿼리
실행 계획을 보면
차이가 난다.
https://dba.stackexchange.com/questions/147421/nvl-v-s-check-is-null
NVL v/s Check IS NULL
We have queries in procedures in oracle like, SELECT ...... WHERE ..... AND (SomeColumn IS NULL OR SomeColumn = SomeThing) But our DBA is saying this is not good, and saying use NVL
dba.stackexchange.com
Try both and see which one works best for your specific query.
이게 가장 맞는 말인 것 같다ㅎㅎ