ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 단일행 함수_문자함수
    Data Base_Oracle/SQL 2020. 1. 2. 23:19

    단일행 함수

    하나의 행에 대해서 결과가 하나의 행으로 나오는 함수

    문자함수

    함수 설명
    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

    문자열 함수는 굉장히 많이 사용되고 중요한 함수이기 때문에 반복 숙달할 필요가 있습니다.

    댓글

Designed by Tistory.