본문 바로가기

자바 웹 개발자가 될거야/DB

[Oracle] 문자함수 / SUBSTR / INSTR/ LPAD / RPAD / TRIM / 숫자함수 / DUAL / 날짜함수 / NEXT_DAY / 변환함수 / TO_CHAR

<  단일 행 함수 >

 

 

① 문자함수

 

- 대소문자 변환 함수

 

· LOWER(바꿀 문자열) : 소문자로 변환

· UPPPER(바꿀 문자열) : 대문자로 변환

· INITCAP(바꿀 문자열) : 맨 앞문자만 대문자

 

 

- 문자 조작 함수

  

  · CONCAT(expr1, expr2) : 두 인수를 연결해서 하나의 문자열로 반환

 

select concat(first_name, last_name) as fullname
from employees;

(==)

select first_name || last_name as fullname
from employees;

 

 

· SUBSTR(expr1, 시작위치, 반환할 문자수) : 문자열 일부분을 반환

substr(주민번호, 1, 6) // 020618

substr(전화번호, 10) // 1234

substr('HelloWorld' , -1, 1) // d

substr('Kochhar', -3, 2) // ha

 

  → 반환할 문자수 생략됐을 때는 문자 끝까지 반환

  → 시작위치가 음수값이면 거꾸로 (맨뒷자리부터 시작)

  → 시작위치가 끝이라고해서 반환 방향이 바뀌는건 아님. 똑같이 정방향으로 진행

 

 

  · LENGTH(expr1) : 문자열 길이 반환

 

LENGTH('HelloWorld') // 10

 

 

  · INSTR(문자열, 지정문자) : 문자열로부터 특정 문자의 첫 번째 인덱스값 반환

 

INSTR('HELLOWORLD', 'W') // 6

 

select employee_id, last_name, instr(last_name,'a')
from employees;

 

 

   → 'a'가 두개이상이면 제일 처음 등장하는 문자 인덱스로 반환

 

 

  · LPAD(반환할 문자열, 전체 자리수, 남는 공간을 채울 문자) : 전체자리수가 되도록 왼쪽부터 지정문자로 채움 (오른쪽 정렬)

  · RPAD(반환할 문자열, 전체 자리수, 남는 공간을 채울 문자) : 전체자리수가 되도록 오른쪽부터 지정문자로 채움 (왼쪽 정렬)

 

LPAD(salary, 10, '*') // *****24000
RPAD(salary, 10, '*') // 24000*****

 

select lpad(last_name, 20, ' ') last_name, rpad(first_name, 20, ' ') first_name
from employees;

 

 

  

  · REPLACE(문자열, 문자열 중 특정문자, 바꿀문자) : 문자열의 특정문자를 다른 문자로 교체

 

REPLACE('JACK and JUE', 'J', 'BL') // BLACK and BLUE

 

select employee_id, last_name, phone_number
from employees;

 

select employee_id, last_name, REPLACE(phone_number, '.', '-') phone
from employees;

 

 

REPLACE 함수 적용 전과후

 

 

 

  · TRIM(특정 문자 FROM 문자열) : 문자열로부터 특정 문자가 접두어나 접미어에 있다면 삭제

 

TRIM('H' FROM 'HelloWorld') // elloWorld

TRIM('H' FROM 'HHelloHHHWorldHHHH') //elloHHHWorld

 

 

 

② 숫자함수

 

 

- ROUND(숫자, 소수점 자릿수) : 소수점 n번째자리까지 반올림

TRUNC(숫자, 소수점 자릿수) : 소수점 n번째자리까지 남기고 버림

 

  · 숫자 자리 인덱스 

... 1 2 3 4 . 5 6 7 ...
... -3 -2 -1 0   1 2 3 ...

  ※ 일의 자리 0은 생략가능 ! 

 

 

- MOD( 숫자, 나눌 수) : 나머지 반환 

 

ROUND(45.926, 2) // 45.93
TRUNC(45.926, 2) // 45.92
MOD(1600, 300) // 100

 

 

※ DUAL 테이블

 

- 함수나 계산 결과를 볼 때 사용하는 공용 테이블

- SYS 소유

- DUMMY라는 하나의 열과 값이 X인 하나의 행 포함

 

dual 테이블 내용
dual 테이블 사용 예시

 

③ 날짜함수

 

- SYSDATE : 현재 데이터베이스 서버 날짜 및 시간을 반환

- 인수 없음 ! 

 

select sysdate from dual;

 

  → 기본 포맷이 'DD-MON-RR' 

 

 

- 날짜를 사용한 산술연산도 가능

 

연산 결과 설명
날짜 + 숫자 날짜 날짜에 일 수를 더함
날짜 - 숫자 날짜 날짜에 일 수를 뻄
날짜 - 날짜 일 수 한 날짜를 다른 날짜에서 뺌
날짜 + 숫자/24 날짜 날짜에 시간 수를 더함

 

select last_name, (SYSDATE-hire_date)/7 as WEEKS
from employees
where department_id = 90;

 

근무한 주 수 구함

 

 

- 날짜 조작 함수

 

  · MONTHS_BETWEEN( 날짜1, 날짜2 ) : 두 날짜 간의 월 수

 

  · ADD_MONTHS( 날짜, 더할 개월수 ) : 날짜에 월 추가

 

  · NEXT_DAY( 날짜, 요일 ) : 날짜에 지정한 요일의 다음 날짜 반환

 

  · LAST_DAY(날짜) : 월의 마지막 날

 

MONTHS_BETWEEN('01-SEP-95', '11-JAN-94'); // 19.6774194

ADD_MONTHS('31-JAN-96',1) // '29-FEB-96'

NEXT_DAY('12-NOV-21','FRIDAY') // 19-NOV-21'

LAST_DAY('12-NOV-21') // '30-NOV-21'

 

  · ROUND( 날짜, 반올림할 기준 ) : 날짜 반올림

 

  · TRUNC( 날짜, 버림할 기준 ) : 날짜 버림

 

SYSDATE = '25-JUL-03' 이라고 가정

ROUND(SYSDATE, 'MONTH') // 01-AUG-03
ROUND(SYSDATE, 'YEAR') // 01-JAN-04

TRUNC(SYSDATE, 'MONTH') // 01-JUL-03
TRUNC(SYSDATE, 'YEAR') // 01-JAN-03

 

  → ROUND(SYSDATE, 'MONTH') 면 DAY를 기준으로 '1~15' 일까지 버림 / '16~30(31)'일 까지 올림

  → ROUND(SYSDATE, 'YEAR') 면 MONTH를 기준으로 '1~6' 월까지 버림 / '7~12'월 까지 올림

 

round(to_date('25-JUN-21'), 'YEAR')  // 01-JAN-21
round(to_date('25-JUL-21'), 'YEAR')  // 01-JAN-22

 

④ 변환함수

 

 

 

요소 결과
YYYY 2020, 2021, ...
YEAR TWENTY TWENTY-ONE, ...
YY / RR 20, 21, ...
MM 06, 07, 08, ...
MONTH JUNE, JULY, AUGUST, ...
MON JUN, JUL, AUG, ...
DY MON, TUE, ...
DAY MONDAY, TUESDAY, ...
DD 01, 02, 03, ...
HH24:MI:SS [AM/am] 15:45:32 [PM/pm]

 

  · 영어로 출력되는 함수는 요소가 대문자/소문자에 따라 결과도 대문자/소문자 구분함

    ( MON → JULY / mon → july / Mon → Jul / DY → FRI / dy → fri )

 

 

- TO_CHAR( DATE, '원하는 포맷' )

 

  · DATE → CHAR

 

TO_CHAR(SYSDATE, 'MM/YY') // 11/21

 

  · 포맷안에 문자열 넣으려면 큰 따옴표로 묶어서 추가 / 여러번 넣을 수 있음

 

select to_char(sysdate, 'YYYY-MM-DD "Time" HH24:MI') as today
from dual;

select to_char(sysdate, '"Today" YYYY-MM-DD "Time" HH24:MI') as now
from dual;

 

 

 

  · ddsp : 날짜를 영어 철자로 표기

  · ddspth : 날짜를 서수까지 표기

 

to_char(sysdate, 'ddsp') // fourteen
to_char(sysdate, 'ddspth') // fourteenth

 

  · fm : 앞에 오는 0 없애줌 ( ex) 01 → 1 )

 

to_char(sysdate, 'fmDD') // 1,2,3,4,5,6,7,8,9,10, ...

 

 

- TO_CHAR( 숫자, '원하는 포맷' )

 

  · NUMBER → CHAR

 

 

요소 결과
9 0 ~ 9
0 0이 표시되도록 강제 적용
$ 달러기호
L 원, 엔, ...
. 소수점
, 천단위 표시 

 

TO_CHAR(salary, '$999,999.00') // $4,200.00

 

 

  → 자리수 초과하는 경우 #으로 출력