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.

이게 가장 맞는 말인 것 같다ㅎㅎ