< 문자 처리 함수 >
* LENGTH / LENGTHB => 결과값 NUMBER 타입
LENGTH(컬럼 | '문자열 값') : 해당 문자열 값의 글자수 반환
LENGTHB(컬럼 | '문자열 값') : 해당 문자열 값의 바이트 수 반환
'김', ' 나', 'ㄱ' 한 글자당 3BYTE
영문자, 숫자, 특문 한글자당 1BYTE
SELECT SYSDATE
FROM DUAL; -- 가상테이블! 테이블 쓸 거 없을때 쓰는 것!
해당 문자열 값의 글자수 반환, 해당 문자열 값의 바이트 수 반환
SELECT LENGTH ('오라클'), LENGTHB ('오라클')
FROM DUAL;
SELECT LENGTH('ORACLE'), LENGTHB('ORACLE')
FROM DUAL;
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;