Database/Oracle

[Oracle] 함수(FUNCTION)_문자 처리 함수

21종 2023. 6. 30. 19:48

< 문자 처리 함수 >


    * LENGTH / LENGTHB      =>  결과값 NUMBER 타입

    LENGTH(컬럼 | '문자열 값')    :   해당 문자열 값의 글자수 반환
    LENGTHB(컬럼 | '문자열 값')   :   해당 문자열 값의 바이트 수 반환
    
    '김', ' 나', 'ㄱ' 한 글자당 3BYTE
    영문자, 숫자, 특문 한글자당 1BYTE

SELECT SYSDATE 
FROM DUAL;  -- 가상테이블! 테이블 쓸 거 없을때 쓰는 것!

해당 문자열 값의 글자수 반환, 해당 문자열 값의 바이트 수 반환

SELECT LENGTH ('오라클'), LENGTHB ('오라클')
FROM DUAL;

한글은 한 글자당 3BYTE

SELECT LENGTH('ORACLE'), LENGTHB('ORACLE')
FROM DUAL;

영어는 알파벳 하나당 1BYTE

 

SELECT EMP_NAME, LENGTH(EMP_NAME), LENGTHB(EMP_NAME),
EMAIL, LENGTH(EMAIL), LENGTHB(EMAIL)
FROM EMPLOYEE;  -- 매행마다 다 실행되고 있음! => 단일행 함수


    * INSTR

    문자열로부터 특정 문자의 시작위치를 찾아서 반환
    
    INSTR(컬럼 | '문자열', '찾고자하는 문자', ['찾을 위치의 시작 값', [순번]])        => 결과값은 NUMBER 타입!!
    
    찾을위치의 시작값
    1 : 앞에서부터 찾겠다.
    -1 : 뒤에서부터 찾겠다.

 

앞에서 시작해서 B는 몇번째?

SELECT INSTR('AABAACAABBAA', 'B') FROM DUAL; -- 찾을 위치의 시작값은 1 기본값 => 앞에서부터 찾음, 순번도 1 기본값

 

앞에서 시작해서 B는 몇번째?

SELECT INSTR('AABAACAABBAA', 'B', 1) FROM DUAL;

뒤에서 시작해서 B는 몇번째?

SELECT INSTR('AABAACAABBAA', 'B',-1) FROM DUAL;

 

앞에서 시작해서 두번째 B는 몇번째?

SELECT INSTR('AABAACAABBA', 'B', 1, 2) FROM DUAL;

 

뒤에서 시작해서 3번째 B는 몇번째?

SELECT INSTR('AABAACAABBA', 'B', -1, 3) FROM DUAL;

 

앞에서 시작해서 EMAIL의 '-' 는 몇번째? 

SELECT EMAIL, INSTR(EMAIL, '_', 1, 1) AS "_위치", INSTR(EMAIL, '@') AS "@위치"
FROM EMPLOYEE;


    * SUBSTR

    문자열에서 특정 문자열을 추출해서 반환 (자바에서 substring() 메소드와 유사)
    
    SUBSTRING (STRING, POSTION, [LENGTH])   => 결과값이 CHARACTER 타입
    - STRING : 문자타입컬럼 또는 '문자열값'
    - POSTION : 문자열을 추출할 시작 위치값
    - LENGTH : 추출할 문자 개수 (생략시 끝까지 의미)

 

SELECT SUBSTR('SHOWMETHEMONEY', 7) FROM DUAL;   -- THEMONEY
SELECT SUBSTR('SHOWMETHEMONEY', 5, 2) FROM DUAL;    -- ME
SELECT SUBSTR('SHOWMETHEMONEY', 1, 6) FROM DUAL;    -- SHOWME
SELECT SUBSTR('SHOWMETHEMONEY', -8, 3) FROM DUAL;   -- THE

 

SELECT EMP_NAME, EMP_NO, SUBSTR(EMP_NO, 8, 1) AS "성별"
FROM EMPLOYEE;

 

여자 사원만 조회

SELECT EMP_NAME
FROM EMPLOYEE
--WHERE SUBSTR(EMP_NO, 8,1) = '2' OR SUBSTR(EMP_NO, 8, 1) = '4';    -- 991212-1122333 => CHAR 형
--WHERE SUBSTR(EMP_NO, 8,1) = 2 OR SUBSTR(EMP_NO, 8, 1) = 4;    -- '2' 가 아닌 숫자형인 2로 써도됨, 오라클 내부에서 자동형 변환해줌

WHERE SUBSTR(EMP_NO,8, 1) IN ('2', '4');

 

남자 사원만 조회

SELECT EMP_NAME
FROM EMPLOYEE
WHERE SUBSTR(EMP_NO, 8, 1) IN (1, 3) -- 내부적으로 자동 형변환
ORDER BY 1; -- 기본적으로 오름차순

 

함수 중첩사용

SELECT EMP_NAME, EMAIL, SUBSTR(EMAIL,1,INSTR(EMAIL,'@') -1) AS "아이디"
FROM EMPLOYEE;


*LPAD / RPAD

    문자열을 조회할 때 통일감 있게 조회하고자 할 때 사용
    
    LPAD / RPAD (STRING, 최종적으로 반환할 문자의 길이, [덧붙이고자하는문자])
    
    문자열에 덧 붙이고자 하는 문자를 왼쪽 또는 오른쪽에 덧붙여서 최종 N길이 만큼의 문자열을 반환

 

SELECT EMP_NAME, RPAD(EMAIL, 20)    -- 덧붙이고자 하는 문자 생략시 기본값이 공백
FROM EMPLOYEE;

 

SELECT EMP_NAME, RPAD(EMAIL, 20, '#')
FROM EMPLOYEE;

 

850101-2****** 조회

SELECT RPAD('850101-2', 14, '*')
FROM DUAL;

 

SELECT EMP_NAME, RPAD (주민번호값으로 성별자리까지 추출한 문자열 ,14, '*')
FROM EMPLOYEE;

-- 1. RPAD 없이
SELECT EMP_NAME, SUBSTR(EMP_NO, 1, 8) || '******'
FROM EMPLOYEE;

-- 2. RPAD 사용
SELECT EMP_NAME, RPAD(SUBSTR(EMP_NO, 1, 8) ,14, '*')
FROM EMPLOYEE;


  * LTRIM / RTRIM

    문자열에서 특정 문자를 제거한 나머지를 반환
    
    LTRIM / RTRIM (STRING, [*제거할문자들*])  => 생략하면 공백 제거
    
    문자열의 왼쪽 혹은 오른쪽에서 제거하고자 하는 문자들을 찾아서 제거 후 문자열 반환

SELECT LTRIM('                K  H   ') FROM DUAL;  -- 공백 찾아서 제거하고 공백아닌 문자 나오면 그냥 끝남

 

SELECT LTRIM('123123KH123', '123') FROM DUAL;

 

SELECT LTRIM('ACABACCKH', 'ABC') FROM DUAL;

 

SELECT RTRIM('5782KH123', '0123456789') FROM DUAL;


    * TRIM

    문자열의 앞 / 뒤 / 양쪽에 있는 지정한 문자들을 제거한 나머지 문자열 반환
    
    TRIM([ [LEADING, TRAILING, 'BOTH'] 제거하고자 하는 문자들 FROM] STRING)

SELECT TRIM('                    K  H                ') FROM DUAL;
--SELECT TRIM('ZZZZKHZZZZ', 'Z') FROM DUAL; <= 얘는 안된다.

 

SELECT TRIM('Z' FROM 'ZZZZKHZZZ') FROM DUAL;

 

SELECT TRIM(LEADING 'Z' FROM 'ZZZZKHZZZZ') FROM DUAL;   -- LEADING : 앞 => LTRIM 과 유사

 

SELECT TRIM(TRAILING 'Z' FROM 'ZZZZKHZZZZ') FROM DUAL;   -- TRAILING : 뒤 => RTRIM 과 유사

 

SELECT TRIM(BOTH 'Z' FROM 'ZZZZKHZZZZ') FROM DUAL;   -- BOTH : DIDwHR => 생략시 기본값


    * LOWER / UPPER / INITCAP

    LOWER / UPPER / INICAP (STRING) => 결과값은 CHARACTER 타입
    
    LOWER : 다 소문자로 변경한 문자열 반환(자바에서의 ToLowerCase() 메소드와 유사)
    UPPER : 다 대문자로 변경한 문자열 반환(자바에서의 ToUpperCase() 메소드와 유사)
    INITCAP : 단어 앞글자마다 대문자로 변경한 문자열 반환

 

SELECT LOWER('Welcome To My World!') FROM DUAL;

 

SELECT UPPER('Welcome To My World!') FROM DUAL;

 

SELECT INITCAP('welcome to my world!') FROM DUAL;


    * CONCAT

    문자열 두개 전달받아 하나로 합친 후 결과 반환
    
    CONCAT(STRING, STRING)      => 결과값 CHARACTER 타입

SELECT CONCAT('ABC', '초콜릿') FROM DUAL;

 

SELECT 'ABC' || '초콜릿' FROM DUAL;

 

SELECT CONCAT('ABC', '초콜릿', '123') FROM DUAL;   -- 오류 발생!! : 2개만 받을 수 있음!

 

SELECT 'ABC' || '초콜릿' || '123' FROM DUAL;


    * REPLACE

    REPLACE(STRING, STR1, STR2)     => 결과값은 CHARACTER 타입

SELECT EMP_NAME, EMAIL, REPLACE(EMAIL, 'kh.or.kr', 'gmail.com')
FROM EMPLOYEE;