본문 바로가기
DataBase/Oracle

함수/단일행 처리 함수) 문자 처리 함수(length,lengthb, instr, substr, lapd, rpad, replace, concat, trim, ltrim, rtrim)

by 박채니 2022. 4. 14.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


FUNCTION

- 일련의 작업 절차를 모아 놓은 database 객체

- 호출 시 인자를 전달하고 리턴 값을 받아 처리

- SQL의 function은 반드시 리턴 값을 가짐

함수 유형
단일행
처리 함수
문자 처리 함수
숫자 처리 함수
날짜 처리 함수
형변환 처리 함수
기타 함수
그룹
처리 함수
그룹마다 호출

단일행 처리 함수

- 매 행마다 함수 호출, 리턴된 값을 결과 집합에 반영

 

문자 처리 함수

 

☞ length(value) , lengthb(value)

- length : value의 글자 수 반환

- lengthb : value의 실제 차지한 데이터 크기

select
    emp_name 사원명, length(emp_name) 사원명length, lengthb(emp_name) 사원명lengthb,
    email 이메일, length(email) 이메일length, lengthb(email) 이메일lengthb
from
    employee;

length() 함수는 실제 입력된 value의 글자 수를 반환하는 함수이고,

lengthb()함수는 value의 실제 차지한 데이터의 크기를 반환하는 함수입니다.

 

한글은 1글자 당 3byte를 차지 하기 때문에 사원명의 lengthb는 9byte로 출력되는 것을 확인할 수 있습니다.

 

 

☞ instr(value, search, [position], [occurrence])

- value에서 search의 인덱스 반환

- [position] : 검색 시작 인덱스

- [occurrence] : 출현 횟수

select
    instr('정보교육원 국가정보원 정보문화사', '정보') 첫번째,
    instr('정보교육원 국가정보원 정보문화사', '정보', 1, 1) 두번째,
    instr('정보교육원 국가정보원 정보문화사', '정보', 1, 3) 세번째,
    instr('정보교육원 국가정보원 정보문화사', '정보', -1) 네번째   -- 뒤에서부터 찾음
from
    dual;

 

 

☞ substr(value, position, [length])

- value에서 position부터 [length]개 잘라서 문자열 반환

select
    substr('show me the money', 6, 2) 첫번째,
    substr('show me the money', 6) 두번째, -- 개수 생략 시 끝까지 잘라옴
    substr('show me the money', -5) 세번째
from
    dual;

 

 

☞ lpad(value, len, [padding_str]), rapd(value, len, [padding_str])

- lpad : len에서 value의 길이를 뺀 만큼 [padding_str]를 왼쪽에 채워서 처리

- rapd : len에서 value의 길이를 뺀 만큼 [padding_str]를 오른쪽에 채워서 처리

select
    lpad('123', 5, '0'),
    lpad('123', 10, '0'),
    
    rpad('123', 5, '0'),
    rpad('123', 10, '0')
from
    dual;

 

select
    rpad('990119-', 14, '*') as rpad_ssn,
    rpad('010-1234-',  13, '*') as rpad_phone
from
    dual;

데이터의 일부만 노출해야 하는 개인 정보 출력 시에 유용할 것 같습니다.

 

 

☞ replace(문자열데이터 또는 열 이름, 찾는문자, [대체문자])

- 특정 문자열 데이터에 포함된 문자를 다른 문자로 대체

- 대체할 문자를 입력하지 않으면, 찾는 문자로 지정한 문자는 데이터에서 삭제

select
    '010-1234-1234' as replace_before,
    replace('010-1234-1234', '-', ' ') as replace_1,
    replace('010-1234-1234', '-') as replace_2
from
    dual;

replace_1은 '-'를 ' ' 공백으로 대체하였기 때문에 '010 1234 1234' 출력,

replace_2는 '-'에 대한 대체 문자를 지정하지 않았으므로 삭제 되어 '01012341234'가 출력 되었습니다.

 

 

☞ concat(value, value)

- 두 개의 문자열 데이터를 하나의 데이터로 연결 (|| 연산자와 유사)

select
    concat(emp_id, emp_name),
    concat(emp_id, concat(' : ', emp_name))
from
    employee
where
    emp_name = '선동일';

 

 

☞ trim([삭제옵션] [삭제할문자] from value)

- 문자열 데이터 내에서 특정 문자를 지우기 위해 사용

- 삭제할 문자 생략 시, 공백 제거

select
    '[' || trim(' _ _ oracle _ _ ') || ']' as trim,
    '[' || trim(leading from ' _ _ oracle _ _ ') || ']' as trim_leading,
    '[' || trim(trailing from ' _ _ oracle _ _ ') || ']' as trim_trailing,
    '[' || trim(both from ' _ _ oracle _ _ ') || ']' as trim_both
from
    dual;

삭제할 문자 생략했으므로, 공백을 제거하고 있으며 각 삭제 옵션 별로 왼쪽/오른쪽/양쪽의 공백이 삭제 되는 것이 확인 됩니다.

 

select
    '[' || trim('_' from '_ _ oracle _ _') || ']' as trim,
    '[' || trim(leading '_' from '_ _ oracle _ _') || ']' as trim_leading,
    '[' || trim(trailing '_' from '_ _ oracle _ _') || ']' as trim_trailing,
    '[' || trim(both '_' from '_ _ oracle _ _') || ']' as trim_both
from
    dual;

삭제할 문자('_') 지정하니 옵션에 따라 왼쪽/오른쪽/양쪽의 '_'가 삭제 되는 것을 확인할 수 있습니다.

 

 

☞ ltrim(value, [삭제할문자], rtrim(value, [삭제할문자])

- 각각 왼쪽, 오른쪽의 지정 문자를 삭제

- 삭제할 문자 생략 시, 공백 문자 삭제

- trim 함수와 달리 삭제할 문자를 여러 개로 지정 가능

select
    '[' || trim(' _oracle_ ') || ']' as trim,
    '[' || ltrim(' _oracle_ ') || ']' as ltrim,
    '[' || ltrim('<_oracle_>', '_<') || ']' as ltrim_2,
    '[' || rtrim(' _oracle_ ') || ']' as rtrim,
    '[' || rtrim('<_oracle_>', '>_') || ']' as rtrim_2
from
    dual;

삭제 대상이 문자일 경우, 해당 문자의 순서와 반복을 통해 만들어 낼 수 있는 모든 조합이 각각 왼쪽/오른쪽에서 삭제 되어 갑니다.

따라서 원본 문자열이 '<_<_oracle'일 경우 → 'oracle' 출력

원본 문자열이 '<_o<_racle'일 경우 → 'o<_racle' 출력 됩니다.


@실습문제

1. 사원 테이블에서 이메일 @ 앞의 아이디를 조회 (사원명, 아이디)

select
    emp_name 사원명,
    substr(email, 1, instr(email, '@')-1) 아이디
from
    employee;

 

2. 사원 테이블에서 여자 사원만 조회 (사원명, 주민번호)

- 성별 컬럼은 존재하지 않으므로 주민번호 뒤 첫번째 자리 참고

select
    emp_name 사원명,
    emp_no 주민번호
from
    employee
where
    substr(emp_no, instr(emp_no, '-')+1, 1) in ('2', '4');