-
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
'개발 > Database' 카테고리의 다른 글
SQL을 활용해서 스네이크 케이스를 카멜 케이스로 바꾸기 (0) 2018.07.26 나도 WITH절을 써보자 (0) 2018.07.26 DELETE VS TRUNCATE VS DROP (0) 2018.07.26 [MariaDB] MariaDB 에서 ROW NUMBER() 사용하기 (0) 2018.01.23 PL/SQL 없이 한 테이블의 평균값을 구하여 다른 테이블에 UPDATE 하기 (0) 2016.12.08 댓글