본문 바로가기

IT/DB

[Oracle] DECODE 함수

DECODE 함수

--------------------------------------------------------------------------------
DECODE는 일반적인 프로그래밍 언어의 IF문을 SQL 문자 또는 PL/SQL 안으로 끌어들여 사용하기 위하여 만들어진 오라클 함수이다.
따라서 일반 프로그래밍 언어의 IF문이 수행 할 수 있는 기능을 포함하고 있다. select시의 decode 사용은 from 절만 빼고 어디에서나 사용할 수 있다.
일반 프로그래밍과 decode 함수를 서로 비교하여 보자.

• IF~THEN~ELSE문장과 똑같은 결과를 출력할 수 있다.

• 각각의 조건에 맞는 값에 대한 처리를 결과와 같게 연산해 리턴한다.

• 비교 연산은 '='만 가능하다.

• CASE 함수는 DECODE 함수의 확장기능이다.

[A]

IF문 Decode 함수 IF A=B THEN
  RETURN 'T';
END IF;

 

DECODE(A,B,'T') IF A=B THEN
  RETURN 'T';

[B]

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

 

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

【형식】
      DECODE(expr,  search1,result1
                  [,search2,result2,...] [,default] );

【예제】
SQL> select ename,sal,comm,
  2  DECODE(deptno,10,sal*1.1,
  3                20,sal*1.2,
  4                   sal*1.3) 인상
  5  from emp;
 
ENAME             SAL       COMM       인상
---------- ---------- ---------- ----------
SMITH             800                   960
JONES            2975                  3570
CLARK            2450                  2695
SCOTT            3000                  3600
KING             5000                  5500
ADAMS            1100                  1320
FORD             3000                  3600
MILLER           1300                  1430
ALLEN            1600        300       2080
WARD             1250        500       1625
MARTIN           1250       1400       1625
 
ENAME             SAL       COMM       인상
---------- ---------- ---------- ----------
TURNER           1500          0       1950
 
12 개의 행이 선택되었습니다.
 
SQL>
SQL> select ename,sal,
  2         decode(sign(sal-3500),-1,'poor','good')
  3  from emp;
 
ENAME             SAL DECO
---------- ---------- ----
SMITH             800 poor
JONES            2975 poor
CLARK            2450 poor
SCOTT            3000 poor
KING             5000 good
ADAMS            1100 poor
FORD             3000 poor
MILLER           1300 poor
ALLEN            1600 poor
WARD             1250 poor
MARTIN           1250 poor
 
ENAME             SAL DECO
---------- ---------- ----
TURNER           1500 poor
 
12 개의 행이 선택되었습니다.
 
SQL>
SQL> select job,sal,
  2    decode(job, 'ANALYST', sal*1.10,
  3                'CLERK'  , sal*1.15,
  4                'MANAGER', sal*1.20, sal) salary
  5  from emp;

JOB              SAL     SALARY
--------- ---------- ----------
CLERK            800        920
SALESMAN        1600       1600
SALESMAN        1250       1250
MANAGER         2975       3570
SALESMAN        1250       1250
MANAGER         2850       3420
MANAGER         2450       2940
ANALYST         3000       3300
PRESIDENT       5000       5000
SALESMAN        1500       1500
CLERK           1100       1265

JOB              SAL     SALARY
--------- ---------- ----------
CLERK            950     1092.5
ANALYST         3000       3300
CLERK           1300       1495

14 개의 행이 선택되었습니다.

SQL>
SQL> select count(decode(to_char(hiredate,'MM'), '01',1)) "Jan",
  2         count(decode(to_char(hiredate,'MM'), '02',1)) "Feb",
  3         count(decode(to_char(hiredate,'MM'), '03',1)) "Mar",
  4         count(decode(to_char(hiredate,'MM'), '04',1)) "Apr",
  5         count(decode(to_char(hiredate,'MM'), '05',1)) "May",
  6         count(decode(to_char(hiredate,'MM'), '06',1)) "Jun",
  7         count(*) "Total"
  8  from emp
  9  where to_char(hiredate,'MM') >= '01' and
 10        to_char(hiredate,'MM') <= '06';

       Jan        Feb        Mar        Apr        May        Jun      Total
---------- ---------- ---------- ---------- ---------- ---------- ----------
         1          2          0          2          2          1          8

SQL>
--------------------------------------------------------------------------------
SQL> select product_id,
  2         DECODE (warehouse_id, 1, 'Southlake',
  3                               2, 'San Francisco',
  4                               3, 'New Jersey',
  5                               4, 'Seattle',
  6                                  'Non domastic') "Location"
  7  from invertories
  8  where product_id < 1775  9  order by product_id, "Location";

'IT > DB' 카테고리의 다른 글

[Oracle] 검색 조건 '%'  (0) 2015.07.27
[Oracle SQL] 테이블 정의서 query  (0) 2015.07.27
[Oracle] Oracle 10g Character set 변경  (0) 2015.07.27
[Oracle] PL/SQL 문법정리  (0) 2015.07.27
[Oracle] Oralce 10g Windows7에 설치  (0) 2015.07.27