The Debugging Chronicles : "코드의 미학"

06 데이터 처리와 가공을 위한 오라클 함수 본문

DBMS/Do it! 오라클로 배우는 데이터 베이스 입문

06 데이터 처리와 가공을 위한 오라클 함수

sweetseonah1004 2024. 7. 29. 17:22

06-1 오라클 함수

함수란?

x와 y 변수가 존재하고 x 값이 변하면 그 변화에 따라 어떤 연산 또는 가공을 거쳐 y값도 함께 변할 때 이 y를 함수라고 한다

 

오라클 함수에서는 특정 결과 데이터를 얻기 위해 어떤 값이나 데이터를 입력하는데 그 값에 따라 고공 또는 여산의 과정을 거쳐 결과 값이 나온다. 즉 오라클 함수는 특정한 결과 값을 얻기 위해 데이터를 입력할 수 있는 특수 명령어를 의미

 

오라클 함수의 종류

내장 함수 built-in-function

사용자 정의 함수 user-defined -function

 

내장함수의 종류

입력 방식에 따라 데이터 처리에 사용하는 행이 나뉜다.

 

데이터가 한 행씩 입력되고 입력된 한 행당 결과가 하나씩 나오는 함수를 단일행 함수 single - row function

 

여러행이 입력되어 하나의 행으로 결과가 반환되는 함수를 다중행 함수 mutiple-row function

 

06-2 문자 데이터를 개공하는 문자 함수

문자 함수

문자 데이터를 가공하거나 문자 데이터로부터 특정 결과를 얻고자 할때 사용하는 함수

 

대, 소문자를 바꿔주는 UPPER , LOWER, INITCAP 함수

함수 설명
UPPER(문자열) 괄호 안 문자 데이터를 모두 대문자로 변환하여 반환
LOWER(문자열) 괄호 안 문자 데이터를 모두 소문자로 변환하여 반환
INITCAP(문자열) 괄호 안 문자 데이터 중 첫 글자는 대문자로 나머지 문자는 소문자로 변환 후 반환

 

SELECT * 
	FROM EMP
    WHERE UPPER(ENAME) = UPPER('scott');
    
-- UPPER 함수로 문자열 비교하기(사원 이름이 SCOTT인 데이터 찾기)

 

문자열 길이를 구하는 LENGTH 함수

특정 문자열의 길이를 구할 때 사용

-- 선택한 열의 문자열 길이 구하기
SELECT ENAME, LENGTH(ENAME)
	FROM EMP;
    
    
-- 사원 이름의 길이가 5 이상인 행 출력하기
SELECT ENAME, LENGTH(ENAME) 
	FROM EMP
    WHERE LENGTH(ENAME) >= 5;

 

 

문자열 일부를 추출하는 SUBSTR함수

주민등록번호 중 생년월일 앞자리만 필요하거나 전화번호의 마지막 네 자리 숫자만 추출하는 경우와 같이 문자열 중 일부를 추출할때 사용

함수 설명
SUBSTR(문자열 데이터, 시작 위치 , 추출 길이) 문자열 데이터의 시작 위치부터 추출 길이 만큼 추출합니다. 시작 위치가 음수 일 경우에는 마지막 위치 부터 거슬러 올라간 위치에서 시작된다
SUBSTR(문자열 데이터 , 시작 위치) 문자열 데이터의 시작 위치부터 문자열 데이터 끝까지 추출한다. 시작 위치가 음수일 경우 마지막 위치부터 거슬러 올라간 위치에서 끝까지 추출

 

-- SUBSTR 함수를 사용하는 예
SELECT JOB, SUBSTR(JOB, 1, 2),SUBSTR(JOB, 3, 2), SUBSTR(JOB, 5)
	FROM EMP;

 

-SUBSTR 함수와 다른 함수 함께 사용하기

-- SUBSTR 함수 안에 다른 함수(LENGTH)함께 사용하기
SELECT JOB,
	SUBSTR(JOB, -LENGTH(JOB)),
    SUBSTR(JOB, -LENGTH(JOB, 2)),
    SUBSTR(JOB, -3)
FROM EMP;

 

문자열 데이터 안에서 특정 문자 위치를 찾는 INSTR 함수

문자열 데이터 안에 특정 문자나 문자열이 어디에 포함되어 있는지를 알고자 할 때 INSTR 함수

INSTR([대상 문자열 데이터(필수)],
             [위치를 찾으려는 부분 문자(필수)],
             [위치 찾기를 시작할 대상 문자열 데이터 위치 (선택, 기본값은 1)],
             [시작 위치에서 찾으려는 문자가 몇번째인지 지정(선택, 기본값은 1)])

 

-- INSTR 함수로 문자열 데이터에서 특정 문자열 찾기
SELECT INSTR('HELLO, ORACLE!', 'L')AS INSTR_1,
       INSTR('HELLO, ORACLE!', 'L',5)AS INSTR_2,
       INSTR('HELLO, ORACLE!', 'L',2,2)AS INSTR_3
   FROM DUAL;

 

--INSTR 함수로 사원 이름에 문자 S가 있는 행 구하기
SELECT*
	FROM EMP
    WHERE INSTR(ENAME, 'S')>0;

-- LIKE 연산자로 사원 이름에 문자 S가 있는 행 구하기
SELECT*
	FROM EMP
	WHERE ENAME LIKE '%S%'

 

특정 문자를 다른 문자로 바꾸는 REPLACE 함수

REPLACE 함수는 특정 문자열 데이터에 포함된 문자를 다른 문자로 댕체할 경우에 유용한 함수

REPLACE([문자열 데이터 또는 열 이름(필수)],[찾는 문자(필수)], [대체할 문자(선택)])
SELECT '010-1234-5678' AS REPLACE BEFORE,
	REPLACE('010-1234-5678','-',' ')AS REPLACE_1, -- 문자를 한칸 공백으로 바꾸어 출력
    REPLACE('010-1234-5678','-',)AS REPLACE_2, -- 대체할 문자를 지정하디 않아 - 문자가 삭제되어 출력
    
    FROM DUAL;

 

데이터의 빈 공간을 특정 문자로 채우는 LPAD,RPAD 함수

LPAD  - LEFT PADDING ; 남은 빈공간을 왼쪽에 채움

RPAD - RIGHT PADDING ; 남은 빈공간을 오른쪽에 ㅇ채움

 

데이터와 자릿수를 지정한 후 데이터 길이가 지정한 자릿수보다 작을 경우에 나머지 공간을 특정 문자로 채우는 함수

만약 빈공간에 채울 문자를 지정하지 않으면 빈공간의 자릿 수 만큼 공백 문자로 띄운다

 

LAPD([문자열 데이터 또는 열이름(필수)] , [데이터의 자릿수(필수)] , [빈 공간에 채울 문자(선택)])
RAPD([문자열 데이터 또는 열이름(필수)] , [데이터의 자릿수(필수)] , [빈 공간에 채울 문자(선택)])

 

-- LPAD, RPAD 함수 사용하여 출력하기

SELECT 'ORACLE'
		LPAD('ORACLE',10, '#') AS LPAD_1, --결과 : ####Oracle
        RPAD('ORACLE',10, '*') AS RPAD_1, --결과 : Oracle****
        LPAD('ORACLE',10) AS LPAD_2,  -- 결과 :    Oracle
        RPAD('ORACLE',10) AS RPAD_2,  -- 결과 :Oracle
  	FROM DUAL;
    
    
    --RPAD 함수를 사용하여 개인정보 뒷자리 * 표시로 출력하기
    
SELECT 
		RPAD('971225-',14,'*') AS RDAP_JMNO, -- 결과 : 971225-********
        RPAD('010-1234-',13,'*') AS RDAP_PHONE -- 결과 : 010-1234-****
    FROM DUAL;

 

두 문자열 데이터를 함치는 CONCAT 함수

두 개의 문자열 데이터를 하나의 데이터로 연결해 주는 역할

SELECT CONCAT(EMPNO,ENAME), -- 결과 : 7788SCOTT
		CONCAT(EMPNO, CONCAT(' : ' , ENAME)) -- 결과 : 7788 : SCOTT
    FROM EMP
    WHERE ENAME = 'SCOTT';

 

 

정 문자를 지우는 TRIM,LTRIM,RTRIM함수

 

TRIM

원본 문자열 데이터를 제외한 나머지 데이터는 모두 생량할 수 있다

삭제할 문자가 생략될 경우에 기본적으로 공백을 제거

삭제 옵션은 왼쪽에 있는 글자를 지우는 LEADING , 오른쪽 TRAILING,양쪽 BOTH

 

TRIM([삭제 옵션(선택)] [삭제할 문자(선택)] FROM [원본 문자열 데이터(필수)])

 

LTRIM,RTRIM

 각 각 왼쪽, 오른쪽 의 지정 문자를 삭제하는데 사용

문자를 하나만 지정하는 것이 아니라 여러 문자 지정이 가능

 

LTRIM([원본 문자열 데이터(필수)] , [삭제할 문자 집합(선택)]) 
-- 원본 문자열의 왼쪽에서 삭제할 문자열을 지정합니다(삭제할 문자열을 지정하지 않으면 공백이 삭제됨)

RTIRM([원본 문자열 데이터(필수)] , [삭제할 문자 집합(선택)]) 
--원본 문자열의 오른쪽에서 삭제할 문자열을 지정합니다(삭제할 문자열을 지정하지 않으면 공백이 삭제됨)

 

SELECT '[' || TRIM(' _ _ Oracle _ _ ' || ']' AS TRIM, -- [_ _ Oracle _ _]
	   '[' || TRIM(LEADING FROM ' _ _ Oracle _ _ ' || ']' AS TRIM_LEADING, -- [_ _ Oracle _ _]
       '[' || TRIM(TRAILING FROM ' _ _ Oracle _ _ ' || ']' AS TRIM_TRAILING, -- [_ _ Oracle _ _]
       '[' || TRIM(BOTH FROM ' _ _ Oracle _ _ ' || ']' AS TRIM_BOTH -- [_ _ Oracle _ _]
   FROM DUAL;
   
 
 --TRIM,LTRIM, RTRIM 사용하여 문자열 출력하기
 SELECT '[' || TRIM(' _Oracle_ ' || ']' AS TRIM -- [_Oracle_]
 		'[' || LTRIM(' _Oracle_ ' || ']' AS LTRIM -- [_Oracle_ ]
        '[' || LTRIM('<_Oracle_>','_<' || ']' AS LTRIM2 -- [_Oracle_>]
 		'[' || RTRIM(' _Oracle_ ' || ']' AS RTRIM -- [ _Oracle_]
        '[' || LTRIM('<_Oracle_>','>_' || ']' AS LTRIM2 -- [<_Oracle]
	FROM DUAL;

06-3 숫자 데이터를 연산하고 수치를 조정하는 숫자 함수

특정 위치에서 반올림하는 ROUND 함수 - 지정된 숫자의 특정 위치에서 반올림한 값을 반환

ROUND([숫자(필수)], [반올림 위치(선택)])

 

특정 위치에서 버리는 TRUNC 함수 - 지정된 숫자의 특정 위치에서 버림한 값을 반환

TRUNC([숫자 (필수)], [버림 위치(선택)]) 
특정 위치에서 숫자를 버림한 결과를 출력하는데 사용, 버림 위치를 지정하지 않을 경우 소수점 첫번째 자리에서 버림

 

지정한 숫자와 가까운 정수를 찾는 CEIL, FLOOR함수 - 지정된 숫자보다 큰 정수 / 작은 정수 중 가장 작은 정수/ 큰 정수를 반환

CEIL([숫자(필수)])
FLOOR([숫자(필수)])

 

숫자를 나눈 나머지 값을 구하는 MOD 함수 - 지정된 숫자를 나눈 나머지 값을 반환

MOD([나눗셈 될 숫자(필수)], [나눌 숫자(필수)]) 
특정 숫자를 나누고 그 나머지를 출력하는 함수

06-4 날짜 데이터를 다루는 날짜 함수

연산 설명
날짜 데이터 + 숫자 날짜 데이터 보다 숫자만큼 일수 이후의 날짜
날짜 데이터  - 숫자 날짜 데이터 보다 숫자만큼 일수 이전의 날짜
날짜 데이터 - 날짜 데이터 두 날짜 데이터 간의 일수 차이
날짜 데이터 + 날짜 데이터 연산 불가, 지원하지 않음

 

 

몇 개월 이후 날짜를 구하는 ADD_MONTHS 함수 

ADD_MONTHS([날짜 데이터(필수)] , [더할 개월 수(정수) (필수)]) 
특정 데이터에 입력한 개월수 만큼의 이후 날짜를 출력

 

두 날짜 간의 개월 수 차이를 구하는 MONTHS_BETWEEN 함수

HONTHS_BETNENC[날짜데이터1(필수)], [날짜데이터2(필수)])

돌아오는 요일, 달의 마지막 날짜를 구하는 NEXT_DAY, LAST_DAY함수

NEXT_DAY([날짜데이터(필수)], [요일문자(필수)])
LAST_DAY([날짜데이터(필수)])

날짜의 반올림, 버림을 하는 ROUND, TRUNC함수

--ROUND 함수 사용하여 날짜 데이터 출력하기
SELECT SYSDATE,
    ROUND (SYSDATE,'CC') AS FORMAT_CC, 
    ROUND (SYSDATE, 'MY") SA FORMAT_MY,
    ROUND (SYSDATE, 'Q') AS FORMAT_O, 
    ROUND (SYSDATE, D' DD' AS FORMAT_DDD, 
    ROUND(SYSDATE, 'HH') AS FORMATH_H
FROM DUAL;

--TRUNC 함수 사용하여 날짜 데이터 출력하기
SELECT SYSDATE,
	TRUNC (SYSDATE, 'CC') SA FORMAT_C,
	TRUNC (SYSDATE, ' M Y AS FORMAT_MY, 04
	TRUNC (SYSDATE, 'Q') AS FORMAT_Q,
	TRUNC (SYSDATE, 'DDD' AS FORMAT_DDD,
	TRUNC (SYSDATE, "HH") SA FORMAT H_
FROM DUAL;

 

06-5 자료형을 변환하는 형 변환 함수

지정된 자료형을 필요에 따라 바꿔주어야할 때 각 데이터에 지정된 자료형을 바꿔주는 함수를 형변환 함수라고 한다.

 

-- 숫자와 문자열 (숫자) 더하여 출려하기
SELECT EMPNO, ENAME, EMPNO + '500' 
FROM EMP
WHERE ENAME = 'SCOTT';

-- 문자열(문자)와 숫자 더하여 출력하기
SELECT 'ABCD' + EMPNO, EMPNO 
	FROM EMP
WHERE ENAME = 'SCOTT';

 

형변환 함수 종류

 


날짜, 숫자 데이터를 문자 데이터로 변환하는 TO_CHAR 함수

TO_CHAR([날짜데이터(필수)],' [출력되길원하는문자형태(필수)]')

 

문자 데이터를 숫자 데이터로 변환하는 TO_NUMBER 함수

문자 데이터를 날짜 데이터로 변환하는 TO_DATE 함수

 

 

06-6 NULL 처리 함수

NVL 함수의 기본 사용법

// 기본 형식
NVL([NULL인지 여부를 검사할 데이터 또는 열(필수)], [앞의 데이터가 NULL일 경우 반환할 데이터(필수)])
// 열 또는 데이터를 입력하여 해당 데이터가 NULL이 아닐 경우 데이터를 그대로 반환하고, NULL인 경우 지정한 데이터로 반환한다.

 

NVL2 함수의 기본 사용법

// 기본 형식
NVL([NULL인지 여부를 검사할 데이터 또는 열(필수)], [앞의 데이터가 NULL이 아닐 경우 반환할 데이터 또는 계산식(필수)], 
    [앞의 데이터가 NULL일 경우 반환할 데이터(필수)])
// 열 또는 데이터를 입력하여 해당 데이터가 NULL이 아닐 때와 NULL일 때 출력 데이터를 각각 지정한다.

06-7 상황에 따라 다른 데이터를 반환하는 DECODE 함수와 CASE문

DECODE 함수

기준이 되는 데이터를 먼저 지정한 후 해당 데이터 값에 따라 다른 결과를 내보내는 함수이다.

기준 데이터를 반드시 명시해야한다.

// 기본 형식
DECODE([검사 대상이 될 열 또는 데이터, 연산이나 함수의 결과],
       [조건1], [데이터가 조건1과 일치할 때 반환할 결과],
       [조건2], [데이터가 조건2와 일치할 때 반환할 결과],
       ...
       [조건n], [데이터가 조건n과 일치할 때 반환할 결과],
       [위 조건1~조건n과 일치한 경우가 없을 때 반환할 결과])

CASE 문

특정 조건에 따라 반환할 데이터를 설정할 때 사용한다.

각 조건에 사용하는 데이터가 서로 상관없어도 된다.

기준 데이터 값이 같은(=) 데이터 외에 다양한 조건을 사용할 수 있다.

// 기본 형식
CASE([검사 대상이 될 열 또는 데이터, 연산이나 함수의 결과(선택)],
     WHEN [조건1] THEN [조건1의 결과 값이 true일 때, 반환할 결과],
     WHEN [조건2] THEN [조건2의 결과 값이 true일 때, 반환할 결과],
     ...
     WHEN [조건n] THEN [조건n의 결과 값이 true일 때, 반환할 결과],
     ELSE [위 조건1~조건n과 일치한 경우가 없을 때 반환할 결과])