경진의 블로그

DECODE(IF문) 본문

자바개발과정/오라클(Oracle)

DECODE(IF문)

aith 2008. 5. 27. 22:50
첨부 파일


DECODE는 일반적인 프로그래밍 언어의 IF문을 SQL문장 또는 PL/SQL 안으로 끌어들여 사용하기 위하여 만들어진 오라클 함수이다.

PL/SQL의 IF문의 형식

IF A = B THEN
  RETURN 'T';
END IF

DECODE의 형식

DECODE(A,B,'T')

SELECT문에서 사용하면 다음과 같이 사용된다.

SELECT DECODE(A,B,'T') AS COL FROM 테이블 이름

위 쿼리문에서 A컬럼과 B컬럼의 값이 다르면 나오는 값은 NULL이다.

이와 같이 단순비교로 사용되는 DECODE는 내부적으로 ELSE의 기능을 가지고 있으며 ELSE에 해당될 경우 널(NULL)을 리턴한다.

SELECT문에서 사용된 DECODE의 완전한 형태이다.

SELECT DECODE(A,B,'T',NULL) AS COL FROM 테이블 이름

주당 강의 시간과 학점이 같으면 '일반'을 출력한다.

SELECT lec_id,decode(lec_time,lec_point,'일반')
   FROM lecture;

주당 강의 시간과 학점이 같은 강의의 숫자를 출력한다

SELECT COUNT(DECODE(lec_time,lec_point,1)) FROM lecture;

위와 같이 쓸 수도 있겠지만 이런 경우는 대개 WHERE절을 이용해 처리하는 것이 정석이다.

SELECT COUNT(*)
   FROM lecture
 WHERE lec_time = lec_point

주당 강의 시간과 학점이 같으면 '일반'을 리턴받은 후 정렬도 하고싶은 경우이다.

SELECT lec_id, DECODE(lec_time,lec_point,'일반')
   FROM lecture
ORDER BY DECODE(lec_time,lec_point,'일반')

PL/SQL의 IF문의 형식

IF A = B THEN
   RETURN 'T';
ELSE
   RETURN 'F';
END IF;

DECODE의 형식

DECODE(A,B,'T','F')

강의 시간과 학점이 다르면 NULL이 리턴되는 대신 '특별'이라고 리턴한다.

SELECT lec_id
           ,DECODE(lec_time,lec_point,'일반','특별')
    FROM lecture;

PL/SQL의 IF문의 형식

IF A = B THEN
   RETURN 'T';
ELSIF A = C THEN
   RETURN 'F';
ELSE
   RETURN 'X';
END IF;

DECODE의 형식

DECODE(A,B,'T',C,'F','X')

요일마다 LOGIN 암호를 자동으로 바꿔주는 프로그램을 만든다고 가정한다.
월요일엔 해당일자에 01을 붙여서 4자리 암호를 만들고, 화요일엔 11, 수요일엔 21, 목요일엔 31 금요일엔 41, 토요일엔 51, 일요일엔 61을 붙여서 4자리 암호를 만든다고 할 때 암호를 SELECT 하는 쿼리를 만든다.

SELECT TO_CHAR(SYSDATE,'DD') ||
       DECODE(TO_CHAR(SYSDATE,'DAY'),'월요일', '01'
                                    ,'화요일','11'
                                    ,'수요일','21'
                                    ,'목요일','31'
                                    ,'금요일','41'
                                    ,'토요일','51'
                                    ,'일요일','61'
              )SEC_KEY FROM dual

PL/SQL의 IF문의 형식

IF A > B THEN
  RETURN 'T';
ELSE
  RETURN 'F';
END IF;

LECTURE 테이블에서 LEC_TIME과 LEC_POINT를 비교한다.
이렇게 비교한 결과를 이용해 LEC_TIME이 크면 '실험과목', LEC_POINT가 크면 '기타과목', 둘이 같으면 '일반과목'으로 값을 돌려 받는다.

SELECT lec_id,lec_time,lec_point
           ,DECODE(SIGN(lec_time-lec_point),0,'일반과목'
                                           ,1,'실험과목'
                                           ,-1,'기타과목')  AS TY
   FROM lecture;

강의시간과 학점이 같거나 강의시간이 학점보다 작으면 '일반과목'을 돌려받고 강의시간이 학점보다 큰 경우만 '실험과목'이라고 돌려받는다.

SELECT lec_id,lec_time,lec_point
           ,DECODE(SIGN(lec_time-lec_point),1,'실험과목','일반과목')  AS TY
   FROM lecture;

LEAST를 이용하는 경우는 아래와 같다.

SELECT lec_id,lec_time,lec_point
           ,DECODE(LEAST(lec_time,lec_point),lec_time,'실험과목','일반과목')  AS TY
   FROM lecture;

PL/SQL의 IF문의 형식

IF A IN (B,C,D) THEN
  RETURN 'T';
ELSE
  RETURN 'F';
END IF;

DECODE의 형식

DECODE(A,B,'T',C,'T',D,'T','F')

PL/SQL의 IF문의 형식

IF A = B OR
  A = C THEN
  RETURN 'T';
ELSE
  RETURN 'F';
END IF;

DECODE의 형식

DECODE(A,B,'T',C,'T','F')

PL/SQL의 IF문의 형식

IF A = B THEN
  IF A = C THEN
    RETURN 'T';
  ELSE
    RETURN 'F';
  END IF;
ELSE
  RETURN 'F';
END IF;

DECODE의 형식

DECODE(A,B,DECODE(A,C,'T','F'),'F')

LECTURE 테이블의 자료 중 LEC_TIME과 LEC_POINT가 같다라는 조건을 만족하고 LEC_TIME = 3 인 자료는 옆에 '중요과목'이라는 비고를 붙이고자 한다.

SELECT lec_id,lec_time,lec_point
           ,DECODE(lec_time,lec_point,DECODE(lec_time,3,'중요과목'))
    FROM lecture;

'자바개발과정 > 오라클(Oracle)' 카테고리의 다른 글

ROWNUM & DECODE 문제풀이  (0) 2008.05.28
HIERACHICAL SELECT(계층질의)  (0) 2008.05.28
DECODE(IF문)  (0) 2008.05.27
ROWNUM  (0) 2008.05.27
SELF JOIN  (0) 2008.05.27
OUTER JOIN  (0) 2008.05.27
0 Comments
댓글쓰기 폼