오라클에서 기본제공하는 내장함가 있고, 사용자가 필요에 의해 직접 정의하는 사용자 정의 함수가 있다.
대,소문자를 바꿔주는 함수들이다.
왜 사용하는가?
SELECT *
FROM EMP
WHERE ENAME LIKE '%Oracle%'
이런 sql문이 있다면, 이름에 Oracle이 들어간 사람이 추출될 것이다.
oRacle, oraCle은 해당사항이 없다.
여기서 UPPER나 LOWER로
WHERE ENAME LIKE UPPER('%Oracle%')
변환 시켜주면 대소문자 구분없이 검색이 가능하다.
문자열 일부를 추출하는 함수.
함수에 들어가는 시작위치는 0부터시작이 아니고 1부터시작이다.
SELECT JOB, SUBSTR(JOB,1,2), SUBSTR(JOB,3,2), SUBSTR(JOB,5)
FROM EMP;
문자열 데이터 안에서 특정 문자 위치를 찾는 함수.
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;
3번째,4번째 인자는 필수가 아니며, 기본값은 1이다.
SELECT *
FROM EMP
WHERE INSTR(ENAME,'S') > 0;
SELECT *
FROM EMP
WHERE ENAME LIKE '%S%';
2개 모두 같은결과이다.
※ DUAL은 무슨 테이블?
최고 권한 관리자 계정인 SYS소유의 테이블로 더미테이블이다.
특정 연산 또는 함수의 단일 결과를 확인할 때 자주 사용한다.
특정 문자열 데이터에 포함된 문자를 다른 문자로 대체하는 함수.
대체할 문자를 입력하지 않으면 지정한 문자는 문자열 데이터에서 삭제된다.
SELECT '010-1234-5678' AS REPLACE_BEFORE,
REPLACE('010-1234-5678','-',' ') AS REPLACE_1,
REPLACE('010-1234-5678','-') AS REPLACE_2
FROM DUAL;
LPAD는 left padding, RPAD는 right padding을 뜻한다.
데이터 길이가 지정한 자릿수보다 작을 경우에 나머지 공간을 특정 문자로 채우는 함수.
SELECT 'Oracle',
LPAD('Oracle',10,'#') AS LPAD_1,
RPAD('Oracle',10,'*') AS RPAD_1,
LPAD('Oracle',10) AS LPAD_2,
RPAD('Oracle',10) AS RPAD_2
FROM DUAL;
두개의 문자열 데이터를 하나의 데이터로 연결해 주는 역할
SELECT CONCAT(EMPNO,ENAME),
CONCAT(EMPNO,CONCAT(' : ',ENAME))
FROM EMP
WHERE ENAME = 'SCOTT';
문자열 데이터 내에서 특정 문자를 지우기 위해 사용되는함수들.
함수 옵션까지 하나하나 다외우기엔 무리가 있기 때문에, TRIM함수가 경우에 따라서 양쪽의 공백을 제거할때 사용한다는 것만 기억해두자.
반올림하는 함수.
반올림 위치는 기본값이 0 이고,
양수면 소수점에서 반올림하는 것 이고
음수면 자연수자리에서 반올림하는 것 이다.
숫자를 버림처리하는 함수.
ROUND()함수와 같다.
특정 날짜에 지정한 개월 수 이후 날짜 데이터를 반환하는 함수.
ADD_MONTHS(날짜데이터, 더할 개월수)
MONTHS_BETWEEN(날짜데이터1,날짜데이터2)
두 날짜 데이터를 입력후, 두 날짜 간의 개월 수 차이를 구함
ROUND(숫자, 반올림 위치)
TRUNC(숫자, 버림 위치)
ROUND(날짜, 반올림 기준 포맷)
TRUNC(날짜, 버림 기준 포맷)
양식은 똑같으나, 기준 포맷에 따라 값을 출력한다.
기준 포맷들은 너무 많아 외우기 쉽지않으니 필요할때 마다 구글링해서 찾자.
숫자데이터를 문자데이터로 혹은 날짜 데이터를 문자데이터로 변환할때 사용한다.
문자 데이터를 숫자 데이터로 변환시킴
문자 데이터를 날짜 데이터로 변환시킴
NVL(NULL인지 여부를 검사할 데이터, NULL일경우 반환할 데이터)
SELECT EMPNO, ENAME, SAL, COMM, SAL+COMM, NVL(COMM,0), SAL+NVL(COMM,0)
FROM EMP;
NVL(NULL인지 여부를 검사할 데이터, NULL이 아닐경우 반환할 데이터, NULL일경우 반환할 데이터)
NVL에서 인자가 하나 더 늘었다.
SELECT EMPNO, ENAME, SAL, COMM, NVL2(COMM,'0','X'),
NVL2(COMM,SAL*12+COMM, SAL*12) AS ANNSAL
FROM EMP;
두 함수 모두 switch case문과 비슷하다.