Post
EN

Oracle Decode 문 [펌]

Oracle 최고의 함수중 하나를 꽂아보라면 난 단연히 DECODE 함수라고 말하고 싶다. IF문의 복잡함을 간소화 시켜줄 뿐만 아니라 그 과정에서 은근히 머리쓰게 만들어서 뇌를 말랑말랑하게 만들어 준다는 점이 그 이유이다.

일단 DECODE 함수는 보통 SELECT 부분에서 사용된다. 예를 들어

SELECT DECODE(check_field, ’1′, ‘Y’, ‘N’) FROM TEST_TABLE

이라고 쓰면 TEST_TABLE 중 check_field 안의 값이 1이면 ‘Y’ 로 변경하고 아니면 ‘N’ 으로 변경하라는 뜻이다. 이걸 IF문으로 고치게 되면, IF check_field = ’1′ THEN     result := ‘Y’; ELSE     result := ‘N’; END IF;

이와 같이  된다. 물론 위의 IF문은 PLSQL에서 사용되며 커서를 통해 패치하면서 단계적으로 값을 출력해야 한다.

그래서 특이한 경우가 아닌한 SELECT 부분에서만 끝날 수 있는 DEOCDE를 즐겨 사용하고 이렇게 처리함으로써 ORM(Object Relational Mapping)을 이용한 개발에서도 용이하게 사용이 가능하다.

하지만 DECODE함수에는 치명적인 약점이 하나 있는데 바로 ‘같을때’ 만 처리가 가능하고 ‘크거나’, 라던가 ‘작거나’ 등에 대한 처리가 불가능하다는 것이다. 하지만 개발자들은 이런 난감한 상황을 멋지게 해결해 놓았다. 이것이 정말 문제라면 ‘크거나 같거나’ 함수를 만들었을지도 모르는데 묘하게도 그런 함수가 존재하지 않는다는 것을 보면 충분히 써먹을 수 있다는 반증이기도 하다는게 아니겠는가.

‘크거나’, 혹은 ‘작거나’ 라는것은 그 비교할 값이 ‘숫자’ 라는 명제하에 출발한다. 아래의 예제코드를 보도록 하자

 SELECT DECODE(FLOOR(sum/10), 0, ‘N’, ‘Y’) FROM TEST_TABLE

위 코드는 TEST_TABLE의 sum 필드가 10 이하이면 ‘N’ 그렇지 않으면 ‘Y’ 을 출력한다. FLOOR() 함수는 소수점 버림 함수이며 sum을 10으로 나누어 소수점 이하를 버리게 될때 10보다 작으면 무조건 0이 나오고 10혹은 10보다 더 크면 그 이상이 나온다는것을 이용한 것이다.

이것을 응용하여 날짜 비교도 할 수 있다.  SELECT DECODE(FLOOR(write_date/20081112), 0, ‘N’, ‘Y’) FROM TEST_TABLE

위 코드에서 write_date 필드는 뒤 나눌 날짜와 형식이 같아야 한다. 일반적으로 YYYYMMDD 형식이므로 필드 형이 date일 경우 TO_DATE(write_date, ‘YYYYMDDD’) 와 같이 날짜 형태를 변환시켜서 둘의 형식을 맞춘 뒤 나누게 된다. 어쨌든 위의 경우 2008년 11월 12일보다 이전이면 ‘N’ 아니면 ‘Y’ 가 출력된다.

DECODE함수는 앞에서 본것처럼 IF, ELSE 외에 파라메터의 수에 따라 If, if else, else 로도 사용이 가능하므로 한번 계속 머리를 굴려 잘 사용해 보도록 하자.

This article is licensed under CC BY 4.0 by the author.