어느 가을날의 전환점

ORACLE|Decode 함수 활용 Tips 본문

Database/Oracle

ORACLE|Decode 함수 활용 Tips

어느가을빛 2011. 4. 10. 23:22
1. DECODE 기본 사용 방법 (=)

IF colVal=10 THEN 1 
ELSE IF colVal=20 THEN 2 
ELSE 3 
END IF 

SELECT DECODE(colVal, 10, 1, 20, 2, 3)
FROM ... 


2. 비교대상이 숫자이면서, 등호가 없는 경우(<, >) 

SIGN 함수를 부호를 출력해 주는데.. 
SIGN(양수)=1, SIGN(음수)=-1, SIGN(0)=0 
을 출력하기 때문에 >, <, >=, <=를 표현할 수 있습니다. 

IF colVal<10 THEN 1 
ELSE IF colVal<20 THEN 2 
ELSE IF colVal<30 THEN 3 
ELSE 4 
문은 다음처럼 표현될 수 있습니다.. 

SELECT DECODE(SIGN(colVal-10), -1, 1, 
                           DECODE(SIGN(colVal-20), -1, 2, 
                                         DECODE(SIGN(colVal-50), -1, 3, 4)
                                        )
                          ) 

FROM .... 


FLOOR 함수도 사용할 수 있는데.. 이 함수는 절사된 값을 출력합니다.. 
FLOOR(0.01) = 0, FLOOR(0,99) = 0 이죠.. 

SELECT DECODE(FLOOR(colVal/10), 0, 1, 
DECODE(FLOOR(colVal/20), 0, 2, 
DECODE(FLOOR(colVal/50), 0, 3, 4))) 
FROM ... 


3. 비교대상이 숫자이면서, 등호가 있는 경우(<=, >=) 


물론 SIGN으로도 표현 가능합니다.. 
그렇지만 CEIL함수를 사용하는게 보기가 덜 복잡하다는 군요.. 
CEIL은 FLOOR와는 반대로 절상된 값을 보여줍니다. 
CEIL(0.01) = CEIL(0.99)=1, CEIL(1.0002)=2 ... 


IF colVal<=10 THEN 1 
ELSE IF colVal <= 20 THEN 2 
ELSE IF colVal <= 50 THEN 3 
ELSE 4 

를 표현한다면.. 

SELECT DECODE(CEIL(colVal/10), 1, 1, 
DECODE(CEIL(colVal/20), 1, 2 
DECODE(CEIL(colVal/50), 1, 3, 4))) 
FROM ... 



4. 비교대상이 숫자가 아니라 문자인경우 

문자가 한 자리인 경우는 ASCII 함수를 이용해서, 
두 자리이상인 경우는 GREATEST나 LEAST 함수를 사용하면 됩니다. 


GREATEST는 비교하는 두 개의 인자 중에서 큰 것을 뽑아내는 함수이고, 
LEAST 는 작은 것을 가려내는 함수 입니다.. 

IF colVal<"C" THEN 1 
ELSE IF colVal<"F" THEN 2 
ELSE 3 
는 다음처럼 표현될 수 있습니다.. 


SELECT DECODE(SIGN(75-ASCII(colVal)), -1, 1, 
DECODE(98-ASCII(colVal), -1, 2, 3)) 
FROM .... 
(75와 98은 "C"와 "F"의 ASCII 코드 값임) 


IF colVal<="ABC" THEN 1 
ELSE IF colVal>="DEF" THEN 3 
ELSE 2 
는 다음 처럼..... 

SELECT DECODE(LEAST(colVal, "ABC") colVal, 1, 
DECODE(GREATEST(colVal, "DEF"), colVal, 3, 2)) 
FROM .... 


IF colVal<"ABC" THEN 1 
ELSE IF colVal>"DEF" THEN 3 
ELSE 2 
는 다음 처럼..... 

SELECT DECODE(LEAST(colVal||" ", "ABC"), colVal||" ", 1, 
DECODE(LEAST(colVal, "DEF"), colVal, 2, 3)) 
FROM .... 


Comments