공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
예제는 Oracle Database에서 기본으로 제공되는 SCOTT계정 데이터로 진행됩니다.
오라클 함수의 종류
- 내장 함수(built-in function) : 오라클에서 기본으로 제공하고 있는 함수
- 사용자 정의 함수(user-defined function) : 사용자가 필요에 의해 직접 정의한 함수
내장함수의 종류
- 단일행 함수(single-row function) : 데이터가 한 행씩 입력되고 입력된 한 행당 결과가 하나씩 나오는 함수
- 다중행 함수(multiple-row function) : 여러 행이 입력되어 하나의 행으로 결과가 반환되는 함수
문자 함수 (단일행 함수)
■ 대 · 소문자를 바꿔주는 함수(UPPER, LOWER, INITCAP)
함 수 | 설 명 |
UPPER(문자열) | ( )안의 문자 데이터를 모두 대문자로 변환하여 반환 |
LOWER(문자열) | ( )안의 문자 데이터를 모두 소문자로 변환하여 반환 |
INITCAP(문자열) | ( )안 문자 데이터 중 첫 글자는 대문자로, 나머지 문자를 소문자로 변환 후 반환 |
UPPER , LOWER , INITCAP 함수를 사용하려면 입력 데이터에 열 이름이나 데이터를 직접 지정해야 한다. 문자열을 비교할때 전부 대문자로 바꾼 뒤에 비교하거나 하는 식으로 활용한다.
■ 문자열 길이 (LENGTH, LENGTHB)
함 수 | 설 명 |
LENGTH(문자열 또는 열이름) | 문자열의 길이를 반환 |
LENGTHB(문자열 또는 열이름) | 문자열의 바이트(byte) 수를 반환 (영어는 한 글자에 1byte, 한글은 2byte) |
SELECT ENAME, LENGTH(ENAME)
FROM EMP
WHERE LENGTH(ENAME) >= 5;
위의 코드처럼 LENGTH 함수를 WHERE 절에서 사용해서 행을 선별할 수 있다.
+ DUAL 테이블
SELECT LENGTH('한글'), LENGTHB('한글')
FROM DUAL;
DUAL 테이블은 오라클의 최고 권한 관리자 계정인 SYS 소유의 테이블로 SCOTT 계정도 사용할 수 있는 더미(dummy)테이블이다. 데이터 저장공간이 아니라서 임시 연산이나 함수의 결과값 확인을 위한 용도로 사용된다.
■ 문자열 일부 추출 (SUBSTR)
함 수 | 설 명 |
SUBSTR(문자열 데이터, 시작위치, 추출길이) | 문자열 데이터의 시작 위치부터 추출 길이만큼 추출, 시작 위치가 음수일 경우에는 마지막 위치부터 거슬러 올라간 위치에서 시작 |
SUBSTR(문자열 데이터, 시작위치) | 문자열 데이터의 시작위치부터 끝까지 추출, 시작 위치가 음수일 경우에는 마지막 위치부터 거슬러 올라간 위치에서 끝까지 추출 |
SELECT JOB,
SUBSTR(JOB, -LENGTH(JOB)),
SUBSTR(JOB, -LENGTH(JOB), 2),
SUBSTR(JOB, -3)
FROM EMP;
위의 코드처럼 다른 함수의 결과값을 SUBSTR 함수의 입력값으로 사용할 수도 있다.
■ 특정 문자 위치 찾기 (INSTR)
INSTR([대상 문자열 데이터(필수)],
[위치를 찾으려는 부분 문자(필수)],
[위치 찾기를 시작할 대상 문자열 데이터 위치(선택, 기본값은 1)],
[시작 위치에서 찾으려는 문자가 몇 번째인지 지정(선택, 기본값은 1)])
-- ex
SELECT INSTR('HELLO, ORACLE!', 'L') AS INSTR_1,
INSTR('HELLO, ORACLE!', 'L', 5) AS INSTR_2,
INSTR('HELLO, ORACLE!', 'L', 2, 2) AS INSTR_3
FROM DUAL;
문자열 데이터 안에서 특정 문자나 문자열이 어디에 포함되어 있는지를 알고자 할 때 INSTR 함수를 사용한다. 총 4개의 입력 값을 지정할 수 있으며, 최소 원본 문자열 데이터와 찾으려는 문자 두 가지는 반드시 지정해 주어야 한다.
INSTR_3 은 마지막 입력값이 2 이므로 두 번째로 등장한 L 을 찾은 것을 확인할 수 있다.
SELECT *
FROM EMP
WHERE INSTR(ENAME, 'S') > 0;
INSTR 은 찾으려는 문자가 문자열 데이터에 포함되어 있지 않다면 위치 값이 없으므로 0 을 반환한다.
이를 이용해서 LIKE 와 비슷하게 사용할 수도 있다. 위의 코드는 INSTR 함수로 사원 이름에 문자 S 가 있는 행을 구하는 예제이다.
■ 다른 문자로 바꾸기 (REPLACE)
REPLACE([문자열 데이터 또는 열 이름(필수)], [찾는 문자(필수)], [대체할 문자(선택)])
-- ex
SELECT '010-1234-5678' AS REPLACE_BEFORE,
REPLACE('010-1234-5678', '-', ' ')AS REPLACE_1,
REPLACE('010-1234-5678', '-') AS REPLACE_2
FROM DUAL;
특정 문자열 데이터에 포함된 문자를 다른 문자로 대체할 때 REPLACE 를 사용한다.
대체할 문자를 입력하지 않으면 지정한 문자는 삭제된다.
■ 빈 공간을 특정 문자로 채우기 (LPAD, RPAD)
LPAD([문자열 데이터 또는 열이름(필수)], [데이터의 자리수(필수)], [빈 공간에 채울 문자(선택)])
RPAD([문자열 데이터 또는 열이름(필수)], [데이터의 자리수(필수)], [빈 공간에 채울 문자(선택)])
-- ex
SELECT 'Oracle',
LPAD('Oracle', 10, '#') AS LPAD_1,
RPAD('Oracle', 10, '*') AS RPAD_1,
LPAD('Oracle', 10) AS LPAD_1,
RPAD('Oracle', 10) AS RPAD_2
FROM DUAL;
각각 Left Padding, Right Padding을 뜻하며 데이터 길이가 지정된 자리수보다 작을 경우에 나머지 공간을 특정 문자로 채우는 함수이다. 채울 문자를 지정하지 않으면 빈 공간만큼 공백이 채워진다.
■ 문자열 합치기 (CONCAT)
SELECT CONCAT(EMPNO, ENAME),
CONCAT(EMPNO, CONCAT(' : ', ENAME))
FROM EMP
WHERE ENAME = 'SCOTT';
두 개의 열이나 문자열 데이터를 하나로 연결해 주는 함수이다. CONCAT 을 사용한 결과 값은 다시 다른 CONCAT 함수의 입력 값으로 사용하는 것도 가능하다.
+ || 연산자
SEELCT EMPNO || ENAME,
EMPNO || ' : ' || ENAME
FROM ...
CONCAT 함수와 유사하게 || 연산자도 열이나 문자열을 연결한다.
■ 특정 문자 지우기 (TRIM, LTRIM, RTRIM)
1. TRIM
TRIM([삭제 옵션(선택)] [삭제할 문자(선택)] FROM [원본 문자열 데이터(필수)])
-- ex1 (삭제할 문자를 지정하지 않는 경우)
SELECT '[' || TRIM(' _ _ Oracle_ _ ') || ']' AS TRIM,
'[' || TRIM(LEADING FROM ' _ _ Oracle_ _ ') || ']' AS TRIM_LEADING,
'[' || TRIM(TRAILING FROM ' _ _ Oracle_ _ ') || ']' AS TRIM_TRAILING,
'[' || TRIM(BOTH FROM ' _ _Oracle_ _ ') || ']' AS TRIM_BOTH
FROM DUAL;
-- ex2 (삭제할 문자를 지정하는 경우)
SELECT '[' || TRIM('_' FROM '_ _ Oracle_ _') || ']' AS TRIM,
'[' || TRIM(LEADING '_' FROM '_ _ Oracle_ _') || ']' AS TRIM_LEADING,
'[' || TRIM(TRAILING '_'FROM '_ _ Oracle_ _') || ']' AS TRIM_TRAILING,
'[' || TRIM(BOTH '_' FROM '_ _Oracle_ _') || ']' AS TRIM_BOTH
FROM DUAL;
TRIM 은 문자열 데이터 내에서 특정 문자를 지우기 위해 사용한다. 삭제할 문자가 생략된 경우에는 기본적으로 공백을 제거하고 삭제 옵션에 따라 LEADING 은 왼쪽, TRAILING 은 오른쪽, BOTH 는 양쪽의 문자를 모두 지운다. 아무 옵션도 안쓸 경우 BOTH 와 같이 양쪽의 문자를 지운다.
2. LTRIM, RTRIM
LTRIM([원본 문자열 데이터(필수)], [삭제할 문자 집합(선택)])
RTRIM([원본 문자열 데이터(필수)], [삭제할 문자 집합(선택)])
-- ex
SELECT '[' || TRIM(' _ Oracle_ ') || ']' AS TRIM,
'[' || LTRIM(' _ Oracle_ ') || ']' AS LTRIM,
'[' || LTRIM('<_Oracle_>', '_<') || ']' AS LTRIM_2,
'[' || RTRIM(' _Oracle_ ') || ']' AS RTRIM,
'[' || RTRIM('<_Oracle_>', '>_') || ']' AS RTRIM_2
FROM DUAL;
LTRIM 은 왼쪽, RTRIM 은 오른쪽의 지정 문자를 삭제하는 데 사용된다. TRIM 함수와 달리 삭제할 문자를 여러 개 지정할 수 있다는 점이 다르다. TRIM 과 마찬가지로 삭제할 문자를 지정하지 않을 경우 LTRIM 은 왼쪽, RTRIM 은 오른쪽의 공백을 제거한다.( TRIM 은 양쪽)
LTRIM 을 사용했을 때 <_<_Oracle 와 같이 지정한 문자가 연속으로 나오는 경우는 한꺼번에 제거되어 결과값이 Oracle 이 되지만, <_O<_racle 과 같은 문자열은 O 에서 삭제 작업이 끝나기 때문에 O<_racle 이 된다.
'Back end > Database' 카테고리의 다른 글
[Oracle] 다중행 함수(Multiple Row Function) (0) | 2019.09.05 |
---|---|
[Oracle] 숫자 함수, 날짜 함수, 형변환 함수, NULL처리 함수, DECODE와 CASE (0) | 2019.09.03 |
[Oracle] WHERE절과 연산자 (0) | 2019.08.28 |
[Oracle] SELECT문의 기본형식 (0) | 2019.08.27 |
[Oracle] 관계형 데이터베이스와 오라클 데이터베이스 (0) | 2019.08.05 |