SQL 단일행 함수_문자함수
단일행 함수
하나의 행에 대해서 결과가 하나의 행으로 나오는 함수
문자함수
| 함수 | 설명 |
|---|---|
| length() | 문자열의 길이를 반환하는 함수 |
| lengthb() | 문자열의 바이트수를 반환하는 함수 |
| lower() | 문자열을 소문자로 반환하는 함수 |
| upper() | 문자열을 대문자로 반환하는 함수 |
| substr() | 문자열에서 문자를 추출하는 함수, substr('문자열', '시작 위치', '추출할 문자 개수') |
| substrb() | 문자열에서 문자를 바이트단위로 추출하는 함수, substrb('문자열', '시작 위치', '추출할 바이트 단위') |
| initcap() | 문자열의 첫글자를 대문자로 반환하는 함수 |
| concat() | 문자열을 결합시키는 함수, concat('앞에 올 문자열', '뒤에 올 문자열') |
| 함수 | 설명 |
|---|---|
| instr() | 문자열의 특정 단어의 인덱스 번호를 반환하는 함수, instr('문자열', '인덱스를 찾을 문자', '시작위치', '~째 문자를 찾을 숫자') 3번째, 4번째 인자는 생략 가능 |
| instrb() | 문자열 내의 문자 위치를 인덱스번호가 아닌 바이트 수로 반환 instr('문자열', '인덱스 바이트를 찾을 문자', '바이트 단위 시작 위치', '~째 문자를 찾을 숫자') |
| trim() | 문자열 내의 공백을 제거하는 함수 |
| lpad() | lpad(문자열, 총 문자열 자리수, 특수기호), 설정한 자리수가 남는다면 왼쪽에서부터 특수기호로 채움 |
| rpad() | lpad()와 동일하며 오른쪽에서부터 특수기호로 채움 |
| replace() | 문자열 내에서 문자를 지정해서 다른 문자로 대체하는 것, 데이터값 자체가 바뀌는 것은 아니며 출력만 해당 문자열로 함 replace(문자열, 변경 전 문자, 변경 후 문자) |
※ 괄호 안의 문자열이 필드명이 아닌 경우에는 ' '[작은따옴표]를 쳐줘야 함
문자함수 사용례
{ LENGTH() }
▶ 직원 14명 중에서 사원 이름의 길이가 5개 이상인 직원을 검색해서 그 직원의 사번, 이름, 업무순으로 출력
[ SQL> select empno, ename, job from emp where length(ename)>=5; ]
| EMPNO | ENAME | JOB |
|---|---|---|
| 7369 | SMITH | CLERK |
| 7499 | ALLEN | SALESMAN |
| ... | ... | ... |
{ LOWER(), UPPER() }
▶ 직원이름은 소문자로, 직업은 대문자로 출력
[ SQL> select empno, lower(ename) 소문자, upper(job) 대문자
2 from emp
3 where length(ename) >= 5; ]
| EMPNO | 소문자 | 대문자 |
|---|---|---|
| 7369 | smith | CLERK |
| 7499 | allen | SALESMAN |
| ... | ... | ... |
{ SUBSTR() }
※ 문자열의 인덱스번호가 1부터 시작함, 'ALLEN'에서 'A'의 인덱스는 1
↔ JAVA[ substring() ], JavaScript 는 0부터 시작
※ 문자열의 인덱스를 뒤에서부터 계산할 때는 음수를 사용
ex) 'QUEEN' 의 -1번째 문자는 'N'
▶'QUEEN'이라는 문자열에서 2번째 문자부터 3개의 문자를 추출
[ SQL> select substr('QUEEN', 2, 3) from dual; ]
강조부분을 다음과 같이 작성 가능 : substr('QUEEN', -3, 3)
| SUB |
|---|
| UEE |
{ SUBSTRB() }
▶ dual 테이블에서 '팔만대장경'의 5번째 바이트 부터 5바이트를 추출
[ SQL> select substrb('팔만대장경', 5, 5) from dual; ]
| SUBST |
|---|
| 대장 |
{ SUBSTR(), INITCAP() }
▶ emp테이블에서 이름의 첫글자가 'K'보다 크고, 'Y'보다 작은 사원들의 사번, 이름, 업무를 이름순으로 출력
[ SQL> select empno, ename, initcap(ename), job
2 from emp
3 where substr(ename, 1, 1) > 'K' and substr(ename, 1, 1) < 'Y'
4 order by 2; ]
※ 문자도 순서에 따라서 범위로 계산 가능, A < Z
| EMPNO | ENAME | INITCAP(ENAME) | JOB |
|---|---|---|---|
| 7654 | MARTIN | Martin | SALESMAN |
| 7934 | MILLER | Miller | CLERK |
| ... | ... | ... | |
| 7521 | WARD | Ward | SALESMAN |
{ instr() }
▶ 사원 이름에 'O'가 몇 번째에 들어가는 지 조회
[ SQL> select ename, instr(ename, 'O') from emp; ]
| ENAME | INSTR(ENAME, 'O') |
|---|---|
| SMITH | 0 |
| JONES | 2 |
| SCOTT | 3 |
※ 해당되는 문자열이 없다면 0을 리턴 ↔ JAVA는 -1을 리턴
{ instrb() }
▶ [ SQL> select instrb('강장공장콩장장', '장', 5, 3) from dual; ]
| INSTRB~ |
|---|
| 13 |
※ 한글은 1글자에 2byte의 용량을 가지기 때문에 5byte에서 시작하면 세 번째 글자인 '공'에서 시작을 하고,
거기서부터 세 번쨰 '장'은 마지막 '장'에 해당하며, 바이트단위로 따지면 13바이트의 인덱스를 갖게 됨
{ lpad(), rpad() }
▶ lpad(), rpad() 사용례
SQL> select empno, ename, lpad(ename, 10, ' * '), rpad(sal, 10, ' # ') from emp where deptno=20;
| EMPNO | ENAME | LPAD(ENAME, 10, ' * ') | RPAD(SAL, 10, ' # ') |
|---|---|---|---|
| 7369 | SMITH | * * * * *SMITH | 800####### |
| 7566 | JONES | * * * * *JONES | 2975###### |
| ... | ... | ... | ... |
{ replace() }
▶ replace() 사용례
SQL> select ename,replace(ename,'A', '$') as "변경 후" from emp;
| ENAME | 변경 후 |
|---|---|
| ALLEN | $LLEN |
| WARD | W$RD |
| MARTIN | M$RTIN |
문자열 함수는 굉장히 많이 사용되고 중요한 함수이기 때문에 반복 숙달할 필요가 있습니다.