ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DECODE 와 CASE : 과연 그놈이 그놈일까
    개발/Database 2018. 7. 18. 15:05

    DECODE와 CASE를 잘 쓰면 소스 코드 짤 때의 삽질을 엄청나게 줄일 수 있기 때문에 쿼리 짤 때 요놈들을 자주 쓰게 된다.

    이걸 배울 때는 DECODE와 CASE는 비슷하게 쓰일 수 있다~ 정도로만 이해하고 넘어갔는데

    오늘 쿼리를 짜면서 문득 이게 별 차이가 없다면 굳이 두개가 다 있을 필요가 없다는 생각이 들었다.

    그래서 좀 더 파보는 시간을 가져보도록 한다.




    1. DECODE 


    DECODE(값, IF1, THEN1, IF2, THEN2, .... ) 



    2. CASE 

      

    CASE 값 

        WHEN IF조건1 THEN1

        WHEN IF조건2 THEN2

            ....

    ELSE  

    END

     


    3. 차이점

        

    물론 신택스가 다르므로 쿼리도 달라진다.


    예) NUM 컬럼의 값이 1이면 첫번째, 2면 두번째, 3이면 세번째, 다른 값이면 기타를 출력

      

     <DECODE>

        SELECT NUM, 

            DECODE(NUM, 1, '첫번째', 2, '두번째', 3, '세번째', '기타') CMMT

          FROM TEMP

       


     <CASE> 

    SELECT NUM,

        CASE WHEN NUM = 1 THEN '첫번째'

               WHEN NUM = 2 THEN '두번째'

               WHEN NUM = 3 THEN '두번째'

               WHEN NUM = 3 THEN '세번째'

        ELSE '기타'

        END CMMT

         FROM TEMP


    위의 예제에서 볼 수 있듯이 단순하게 짜는 경우에는 CASE문의 길이가 훨씬 길어진다. 

    실행속도 역시 몇번 실행해본 결과 이 정도 수준의 쿼리에서는 크게 차이나지 않는다.

    하지만 이거저거 깔짝깔짝 검색해본 결과로는 CASE문이 더 빠르다고 한다.


    또한 결정적인 차이점을 스택오버플로우의 어떤 갓느님의 답변에서 찾아볼 수 있었는데,

    바로 CASE는 STATEMENT 이고 DECODE는 함수 라는 사실이다. CASE도 함수라고 생각하며 살았던 지난 날이 모두 무너진다ㅠㅠ

    CASE는 SQL과 PL/SQL에서 모두 사용 가능하지만 DECODE는 SQL에서만 사용 가능하다. 

    예제와 같이 CASE 문에서는 WHEN 이후에 조건문을 작성할 수 있지만 DECODE는 조건값과 같은지 여부만 판별 가능하다. 

    (즉 CASE는 다양한 비교연산이 가능하나 DECODE는 등가연산만 가능)


    이 둘은 NULL 비교 연산에서 가장 큰 차이를 보이는데, 

    DECODE는 NULL과 NULL을 비교했을 때 TRUE값을 반환하는 반면 CASE는 그렇지 않다고 한다...

    뭔 말인고 하면 아래 쿼리를 실행했을 때 


    SELECT DECODE(NULL, NULL, 1, 0) AS DECODE_NULL,

              CASE NULL

                  WHEN NULL THEN 1

                  ELSE 0

               END AS CASE_NULL_1,

               CASE 

                   WHEN NULL IS NULL THEN 1

                   ELSE 0

                END AS CASE_NULL_2

      FROM DUAL;



    요런 결과가 출력이 된다. 


    정리하자면

    - CASE는 STATEMENT 이고 DECODE는 함수

    - 단순한 쿼리에서는 성능 차이가 없음

    - NULL과 NULL 비교 시 DECODE는 참, CASE는 거짓을 반환하므로 CASE문으로 NULL 비교 연산 시 쿼리 작성에 주의해야 

    - DECODE는 등가연산만 가능하지만 CASE는 다양한 비교연산이 가능


    확실히 DECODE를 쓰면 간단한 쿼리문에서는 길이가 훨씬 짧으므로 

    단순 등가비교에서는 DECODE, 조금 복잡한 조건을 걸 때는 CASE를 쓰면 될 것 같다.

    아래 링크는 정리하면서 참고한 곳

    https://stackoverflow.com/questions/3193692/case-vs-decode

    http://www.oracleinformation.com/p/sql-tutorial.html

    댓글

Designed by Tistory.