SQL

[Oracle] 단일행 함수 - 문자함수

ㄷㅐ장님 2021. 12. 22. 17:31

함수

-중첩가능

1. 단일행 함수

①문자함수

upper : 대문자로 변환

lower : 소문자로 변환

initcap : 첫글자 대문자 나머지는 소문자로 변환

-인덱스를 변형하기 때문에 주의

문자 연결(concat)

 

concat : 연결연산자(||)와 동일한 기능의 함수. 2개만 연결 가능. 리터럴문자 불가! 열이름만 가능!!

열이름1 || 열이름2 || 열이름3 = concat(concat(열이름1,열이름2),열이름3)

문자의 길이(length,lengthb)

length : 문자의 길이를 숫자값으로 반환

lengthb : 문자의 바이트값으로 반환(영문자)

from dual; : 가상의 테이블 환경을 구성하여 결과 확인할 때 사용.

select * from nls_session_parameters; --session(지역)의 정보(client 정보)
select * from nls_database_parameters; --database 정보(db server 정보)​

 

  • AL32UTF8(유니코드) : db에 설정된 문자, 출판되는 글자는 다 입력가능. 한글 3byte
  • KO16MSWIN949 : 한글,한자,영어,일어만 저장. 한글 2byte

instr(열이름 또는 ‘문자열’,’찾는 문자’,시작점,몇번째로 찾는지)생략가능

: 문자의 위치를 리턴하는 함수. 위치 기준은 시작점이 바뀌어도 똑같음!!

instr(열이름,’a’,1,1) => ’a’가 처음으로 나오는 위치

instr(열이름,’a’,1,2) => ’a’가 두번째로 나오는 위치


[문제13]문자열 중에 두 번 이상 a가 있는 last_name을 출력

①
select * from employees
where instr(last_name,'a',1,2)>0;
②
select * from employees
where instr(last_name,’a’,1,2)>0;
③
select * from employees
where last_name like ‘%a%a%’;

substr(열이름 또는 '문자',시작점,추출개수)

: 문자를 개수만큼 추출하는 함수

substr(열이름,1,1) —첫번째 글자 추출

substr(열이름,-1,1) —마지막 글자 추출

-substrb(열이름 또는 '문자',시작점,추출 바이트수) : 문자를 바이트 수만큼 추출하는 함수

한글 : 3byte, 영문 : 1byte (유니코드)

 

trim(’제거할 문자열’ from 열이름 또는 ‘문자열’)

: 왼쪽(접두), 오른쪽(접미) 부분에 연속되는 문자를 제거하는 함수

-trim(열이름 또는 ’문자열’) : 접두/접미 공백문자 제거 시 from 사용 X

-ltrim(열이름 또는 ‘문자열’,’제거할 문자’) : 왼쪽(접두)부분에 연속되는 문자 제거

-rtrim(열이름 또는 ‘문자열’,’제거할 문자’) : 오른쪽(접미) 부분에 연속되는 문자를 제거하는 함수


[문제14] employees 테이블에 last_name 컬럼의 값 중에 "J" 또는 "A" 또는 "M"으로 시작하는 사원들의 last_name(첫번째 문자는 대문자, 나머지는 모두 소문자)과 last_name의 길이를 표시하는 query(select문) 를 작성합니다. 사원들의 last_name을 기준으로 결과를 오름차순 정렬해 주세요.

①
select initcap(last_name), length(last_name) 
from employees 
where instr(last_name,'J',1,1)=1 
or instr(last_name,'A',1,1)=1 
or instr(last_name,'M',1,1)=1 
order by last_name asc;
②
select initcap(last_name), length(last_name) 
from employees 
where last_name like 'J%' 
or last_name like 'A%' 
or last_name like 'M%' 
order by last_name asc;
③
select initcap(last_name), length(last_name) 
from employees 
where substr(last_name,1,1) in (’J’,’A’,’M’) 
order by last_name asc;

[문제15] employees테이블에서 department_id(부서코드)가 50번 사원들 중에 last_name에 두번째 위치에 "a"글자가 있는 사원들을 조회하세요.

①
select * from employees
where department_id=50
and instr(last_name,'a',1,1)=2;
②
select * from employees
where department_id=50
and last_name like '_a%';
③
select * from employees
where department_id=50
and substr(last_name,2,1)='a';

replace(열이름 또는 '문자','old 문자','new 문자')

: 문자를 다른 문자로 치환하는 함수

-new문자를 입력하지 않으면 빈 문자열(’’)이 기본값으로 입력된다.

특정 철자를 N개 만큼 채우기(lpad,rpad)

 

lpad(열이름 또는 ‘문자열’,전체길이,'채워넣을 문자열')

: 문자의 자리를 고정시킨 후 문자값을 오른쪽 기준으로 채우고

빈 왼쪽 공백을 다른값으로 채움

rpad(열이름 또는 ‘문자열’,전체길이,'채워넣을 문자열')

: 문자의 자리를 고정시킨 후 문자값을 왼쪽 기준으로 채우고

빈 오른쪽 공백을 다른값으로 채움


[문제16] salary에 있는 값을 1000당 * 출력

SALARY  STAR

6000     ******

4800      ****

4800      ****

...

select salary, lpad('',salary/1000,'') as "STAR"
from employees;

[문제20] 주민번호 뒷6자리부분을 아래화면과 같이 출력해주세요.

주민번호_1             주민번호_2

210101-1234567     210101-1******

select '210101-1234567' as 주민번호_1, rpad(substr('210101-1234567',1,8),14,'*') as 주민번호_2
from dual;

[문제21] 전화번호 가운데 4자리부분을 아래화면과 같이 출력해주세요.

전화번호_1            전화번호_2

010-1000-1004    010-*****-1004

select '010-1000-1004' as 전화번호_1, rpad(substr('010-1000-1004',1,4),8,'*') ||
                                          substr('010-1000-1004',9,5) as 전화번호_2
from dual;

[문제22] 메일주소를 아래화면과 같이 출력해주세요.

EMAIL_1             EMAIL_2

james@it,com    j*@it,com

①
select 'james@it,com' as "EMAIL_1", concat(concat(substr('james@it,com',1,1) , 
                                                  rpad('',instr('james@it,com','@',1,1)-2,'')),
                                          substr('james@itwill.com',instr('james@it,com','@',1,1))) 
                                     as "EMAIL_2"
from dual;
②
select 'james@it,com' as "EMAIL_1", rpad(substr('james@it,com',1,1),
                                          instr('james@it,com','@',1,1)-1,'*') || 
                                         substr('james@it,com',
                                          instr('james@it,com','@',1,1)) 
                                     as "EMAIL_2"
from dual;