Link Search Menu Expand Document

SQL Single String Function

Table of contents

  1. String Functions
    1. upper() / lower() / initcap()
    2. length() / lengthb()
    3. concat()
    4. substr() / substrb()
    5. instr() / instrb()
    6. lpad() / rpad()
    7. trim() / ltrim() / rtrim()
    8. replace()
  2. Example

String Functions

대소문자를 변환하거나 문자열의 길이를 반환하거나 데이터를 조작하는 함수 등으로 나뉨

upper() / lower() / initcap()

대소문자 변환 함수

syntax

upper() : 소문자를 대문자로 변환

lower() : 대문자를 소문자로 변환

initcap() : 첫글자를 대문자, 나머지는 소문자로 변환

▸ ()안에는 문자열이나 함수, 열이름(데이터 타입 문자열)등이 들어갈 수 있음

-- upper(lower(ename))는 소문자 변환한걸 대문자로 다시 변환한 모습
select ename
    , lower(ename)
    , upper(ename)
    , initcap(ename)
    , upper(lower(ename)) 
from emp;

length() / lengthb()

문자 길이를 반환하는 함수

syntax

length() : 문자길이를 리턴(한글인 경우 1byte)

lengthb() : 문자길이를 리턴(한글인 경우 2byte)

▸ ()안에는 문자열이나 함수, 열이름(데이터 타입 문자열)등이 들어갈 수 있음

-- 한글 하나는 3바이트 = 두개라서 6
select name
    , length(name)
    , lengthb(name)
    , length('소향')
    , lengthb('소향') 
from professor;

한글을 3Byte로 인식할 때

오라클 설치 시 문자 집합을 어떻게 설정했느냐에 따라 한글을 인식하는 Byte의 길이가 달라짐

▸ KO16KSC5601이나 KO16MSWIN949는 한글 한 글자를 2Byte로 인식

▸ UTF8이나 AL32UTF8의 경우 한글 한 글자를 3Byte로 인식 → 한글 정렬이 가능하다는 장점이 있음

→ 아래 코드는 사용중인 문자 집합을 확인할 수 있음

-- SQL PLUS 접속
SQL > SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%';

Tistory

concat()

문자 연결 함수

▸ concat()과 ||은 동일하게 작동함

syntax

concat() : 문자의 값을 연결

▸ ()안에는 문자열이나 함수, 열이름 등이 들어갈 수 있음

select name
    , id
    , name || ',' || id
    , concat(concat(name, ','),id) comma
    , concat(concat('소향의 직업은 ','가수 입니다! '), '나이는 42살 입니다') as 소향 
from professor;

substr() / substrb()

문자 추출 함수

▸ 한글 같은 경우 문자단위로 자를때 깨지는 경우가 있어서 substrb인 바이트 단위로 자르면 깨지는걸 방지할 수 있음

→ 바이트를 잘못 설정해서 자르면 값이 있긴 한데 제대로 된 값이 아님 (공백인데 값이 있는 공백으로 출력)

syntax

substr(값, from, length) : 주어진 문자에서 문자 단위로 자를때 추출

substrb(값, from, length) : 주어진 문자에서 바이트 단위로 문자열을 자를때 사용

▸ from부터 시작, length갯수 만큼 자름

▸ from에서 음수값이 들어갈경우 뒤에서부터 셈

-- 오라클 설정이 utf8로 되어있어서 한글 한글자는 3byte
select 'abcde' 
    , substr('abcde', 2) 
    , substr('abcde', 3, 2) 
    , substr('abcde', -3, 2) 
    , substr('abcde', -3, 3)
    , substr('abcde', 3, 3000)
    , substrb('안녕하세요', 6,12)
from dual; 

!note

한글에 substrb()사용시 제대로 바이트값을 지정하지 않으면 비정상적인 값이 출력됨

select '홍길동'
    , substr('홍길동',1,2)
    , substrb('홍길동',1,2)  --값이 있긴 한데 제대로 된 값이 아님
    , substrb('홍길동',1,3)
from dual;

instr() / instrb()

문자의 위치값을 반환하는 함수

▸ 음수값이 들어가면 뒤에서부터 찾지만, 값은 앞에서부터 세서 출력해줌

▸ 시작위치, 몇번째 인수는 생략할 수 있음, 기본값 둘다 1

syntax

instr(문자열, 찾는글자, 시작위치, 몇번째(기본값 1)) : 주어진 문자에서 특정문자의 위치를 리턴

instrb(문자열, 찾는글자, 시작위치, 몇번째(기본값 1)) 주어진 문자에서 특정문자의 위치 바이트를 리턴

select instr('HELLOW WORLD', 'O') O찾기
	, instr('HELLOW WORLD', 'O', -1) 뒤에서O찾기 -- 마이너스는 거꾸로 찾음
	, instr('HELLOW WORLD', 'O', -1,2) 뒤에서두번째O찾기
	, instr('안녕하세요하', '하') 하가나오는순서찾기
	, instrb('안녕하세요하', '하') 첫번째하의바이트찾기
	, instr('안녕하세요하', '하', -1) 뒤에서하가나오는순서
	, instrb('안녕하세요하', '하', -1) 뒤에서하의바이트찾기
	from dual;

lpad() / rpad()

조건에 따라 특정 길이의 문자를 반환하는 함수

syntax

lpad(문자열, 총 문자열 자리수, 나머지 문자열에 채울문자) : 주어진 문자열에서 왼쪽으로 특정 문자를 채움

rpad(문자열, 총 문자열 자리수, 나머지 문자열에 채울문자) : 주어진 문자열에서 오른쪽으로 특정 문자를 채움

select name, id, length(id)
	, lpad(id,7,'*')
	, rpad(id,7,'*')
	, lpad('123456789', 15, '$')
	, rpad('123456789', 15, '$')
from student
where deptno1 = 201;

trim() / ltrim() / rtrim()

문자를 다듬는 함수

syntax

trim(문자열, 양쪽에서 자를 문자) : 칼럼이나 대상 문자열에서 특정 문자가 첫 번째 글자이거나 마지막 글자이면 잘라내고 남은 문자열만 반환

ltrim(문자열, 왼쪽에서 자를 문자) : 주어진 문자열에서 왼쪽의 특정 문자나 공백를 삭제

rtrim(문자열, 오른쪽에서 자를 문자) : 주어진 문자열에서 오른쪽의 특정 문자나 공백 문자를 삭제

select ' Oracle mania '
    , trim(' Oracle mania ')
    , ltrim(' Oracle mania ')
    , rtrim(' Oracle mania ')
    , trim('O' from 'Oracle mania')
from dual;

select ename 
     , ltrim(ename, 'C')
     , ltrim(ename, 'KI')
     , ltrim(ename, 'MI')
     , rtrim(ename, 'MI')
from emp
where deptno = 10;

replace()

문자열을 다른 문자열로 치환하는 함수

syntax

replace(문자열, 변경전문자, 변경후문자)

select ename
     , replace(ename, 'KI', '**')
     , replace(ename, 'I', '------')
     , replace(ename, substr(ename,1,2), '**')
  from emp
 where deptno = 10;


Example

Q1. STUDENT 테이블의 주민등록번호(JUNIN)에서 성별만 추출

select jumin, substr(jumin, 7,1) 성별 from student;
select jumin, substr(jumin, 7,1) 성별 from student 
    where substr(jumin,7,1) = '1' or substr(jumin,7,1) = '3'; --남자만 추출하는 방법

Q2. STUDENT 테이블의 주민등록번호(JUNIN)에서 월일만 추출{: .mt-2}

select jumin, substr(jumin,3,4) "월일" from student;

Q3. STUDENT 테이블의 주민등록번호(JUNIN)에서 1전공이 101번인 학생들의 이름과 태어난 월일, 생일 하루 전 날짜를 출력{: .mt-2}

select name
	, substr(jumin,3,4)
	, substr(jumin,1,2) || '.' ||  substr(jumin,3,2) || '.' ||  substr(jumin,5,2) birthday
	, birthday - 15
from student 
where deptno1 = 101;

Q4. ‘CLARK’, ‘KING’, ‘MILLER’에 왼, 오른쪽으로 ‘123456789’를 채우는데 문자열의 나머지 순서대로 숫자 채우기

select lpad('CLARK',9,'123456789')
    , lpad('KING',9, '123456789')
    , lpad('MILLER',9,'123456789')
    , rpad('CLARK',9, substr('123456789', length('CLARK')+1,(9-length('CLARK'))))
    , rpad('KING',9, substr('123456789', length('KING')+1,(9-length('KING'))))
    , rpad('MILLER',9, substr('123456789', length('MILLER')+1,(9-length('MILLER'))))		 
from dual; 

Q5. EMP 테이블에서 DEPTNO 20인 사원들의 이름과 3~4번째글자를 ‘-‘ 변경

ex) SMITH –> SM–H

select ename
    , replace(ename, substr(ename,3,2), '--')
from emp;

Q6. STUDENT 테이블에서 DEPTNO1 101 학생들의 이름과, 주민번호를 출력, 주민번호 7자리는 ‘-‘와 ‘/’로 표시

ex) 123456-/-/-/-

select name, jumin
     , replace(jumin, substr(jumin,7),'-/-/-/-')
 from student
where deptno1 = 101;

Q7. STUDENT 테이블에서 DEPTNO1 102 학생들의 이름과 전화번호를 출력, 전화번호는 국번만 ‘*‘처리

ex) 051)999-9999 –> 051)***-9999

select name, tel
    , instr(tel, ')') -- )가 나오는 위치
    , instr(tel, '-') -- -가 나오는 위치
    , instr(tel, '-') - instr(tel, ')') -- )와 - 사이의 숫자 개수
    , substr(tel,instr(tel, ')')+1,instr(tel, '-') - instr(tel, ')')-1) -- 번호 중간값 추출
    , lpad('*',instr(tel, '-') - instr(tel, ')')-1,'*') -- 추출한 번호를 *로 변경
    , replace(tel, substr(tel,instr(tel, ')')+1,instr(tel, '-') - instr(tel, ')')-1),lpad('*',instr(tel, '-') - instr(tel, ')')-1,'*'))
from student;
where deptno1 = 102;

Q8. STUDENT 테이블에서 DEPTNO1 102 학생들의 이름과 전화번호를 출력, 전화번호는 뒷자리를 *로 출력

ex) 051)999-**

select name, tel
    , replace(tel, substr(tel,instr(tel,'-')+1, 4), '****')
from student
where deptno1 = 102;


이 웹사이트는 jekyll로 제작되었습니다. Patrick Marsceill, Distributed by an MIT license.