본문 바로가기
수업(국비지원)/Oracle

[Oracle] SQL 단일행 함수 - 문자 함수(문자열의 길이) length, lengthb, substr, instr

by byeolsub 2023. 4. 14.

4) length

        : 문자열 길이

length(‘한글’) -> 2

5) lengthb
           : 저장하기 위해 필요한 바이트 수
             영어, 숫자 저장 시 1바이트 필요.
             한글을 저장 시 3바이트 필요.   → 시스템 마다 다르다.

lengthb(‘한글’) -> 4
예시 : 
select lengthb('홍길동') from dual;

dual 테이블 : 더미 테이블. 오라클에서 의미없는 테이블로 사용 할 수 있도록 생성된 테이블.


 6) substr
        : 부분 문자열 함수 

substr(‘ABC’,1,2) -> AB

substr(칼럼 명,1부터 시작하는 인덱스,글자수) ← 공백도 셈함. 

substr(칼럼 명,음수부터 시작하는 인덱스(뒤부터),글자수) 
      - ex) 시작 인덱스 : -1 => 뒤에서 첫번째
                          -2 => 뒤에서 두번째
예시 : 
 select substr('안녕 나는 홍길동이야',7,3) from dual;
 // 

substr(75030316826,1,6) : 750303

문제 :
 1. 학생 중 생일이 3월인 학생의 이름,생년월일 조회하기.
 생일은 주민번호를 기준으로 함.
select name,jumin,substr(jumin,1,6) 생년월일 from student where substr(jumin,3,2)='03';
문제 : 
 2. 학생의 이름,생년월일 조회하기. 생년월일은 주민번호를 기준으로 한다.
 생일의 월을 기분으로 정렬하여 출력하기.
select name,substr(jumin,1,6) 생년월일 from student order by substr(jumin,3,2);

select name,substr(jumin,-13,6) 생년월일 from student order by substr(jumin,-11,2);

 7) instr
        : 문자열(칼럼값)에서 해당문자의 위치값 리턴

instr(‘A*B#’,’#’) - > 4

instr(문자열,'찾을 문자값',[시작인덱스,번째])
예시 : 
 1. 'A*B*C'에서 첫번째'*'문자의 위치 리턴 //2
select instr('A*B*C','*') from dual;
 
 2. 'A*B*C'에서 '0'문자의 위치 리턴 //0. 해당문자 없음.
select instr('A*B*C','0') from dual;

 3. 'A*B*C'에서 두번째'*'문자의 위치 리턴 //4
select instr('A*B*C','*',1,2) from dual;

 4. 'A*B*C'에서 세번째'*'문자의 위치 리턴 //0. 해당문자 없음.
select instr('A*B*C','*',1,3) fromn dual;

 5. 'A*B*C'에서 '*'문자를 뒤부터 4번째 인덱스 부터 검색하여 1번째 있는 위치 리턴 //2
select instr('A*B*C','*',-4) from dual;
select instr('A*B*C','*',-3) from dual; //값은 위와 동일.

 6. 'A*B*C'에서 '*'문자를 뒤부터 4번째 인덱스 부터 검색하여 2번째 있는 위치 리턴 //4
select instr('A*B*C','*',-1,1) from dual; 

 7. 'A*B*C'에서 '*'문자를 뒤부터 1번째 인덱스 부터 검색하여 2번째 있는 위치 리턴 //2
select instr('A*B*C','*',-1,2) from dual;

문제 : 
 1. 학생테이블에 이름,전화번호(tel),tel 컬럼의')'문자의 위치를 출력하기.
select name,tel,instr(tel,')') from student;

문제 : 
 2. 학생의 이름,전화번호,지역번호를 출력하기.
  - instr(tel,')') : ')'의 위치값
  - substr(칼럼명,시작인덱스,글자개수) 
select name,tel,substr(tel,1,instr(tel,')')-1) 지역번호 from student;