[210914] 함수(Function), 시스템 설정 (언어, 영역, 타임 존)
- 함수 기능을 테스트할 때 DUAL 테이블(더미 테이블)을 사용하여 테스트 진행.
SELECT 함수명() FROM DUAL;
- 단일 행 함수 / 그룹 함수
- 테이블은 행단위로 데이터 저장, 하나의 행 단위로 함수를 거쳐서 결과를 도출 할 때 단일 행 함수, 하나의 행을 실행할 때마다 결과 반환.
- 모든 행의 데이터를 이용, 그룹으로 묶인 행에 대해 결과를 반환시키고자 할 때 그룹 함수, 그룹당 하나의 결과 반환.
- 두 함수 모두 매개변수 존재, 어떠한 매개변수 값을 전달하느냐에 따라 결과가 도출
단일 행 함수
- 하나의 행 단위로 함수 구성
- 행마다 반복적으로 함수가 적용이 되어서 입력 받은 행의 개수만큼 결과 값 반환
- 입력 받은 수만큼 반환되므로 결과 값 여러 개
문자 처리 함수
- 대표적인 단일행 함수 (입력값 타입 = 매개변수)
✔ LENGTH
주어진 컬럼 값/문자열의 길이(문자 개수) 반환
작성법 | 리턴 값 타입 |
LENGTH (CHAR | STRING) * CHAR | STRING : 문자 타입 컬럼 또는 문자열 |
NUMBER |
SELECT LENGTH('HELLO') FROM DUAL; -- 결과 : 5 |
✔ LENGTHB
주어진 컬럼 값/문자열의 길이(BYTE) 반환
작성법 | 리턴 값 타입 |
LENGTHB (CHAR | STRING) * CHAR | STRING : 문자 타입 컬럼 또는 문자열 |
NUMBER |
SELECT LENGTH('안녕하세요'), LENGTHB('안녕하세요') FROM DUAL; -- 결과 : 15 --오라클 한글 한자당 3바이트 바이트 관련 처리에는 B 들어감 |
✔ INSTR (인덱스 스트링의 약자)
지정한 위치부터 지정한 숫자 번째로 나타나는 문자의 시작 위치 반환
작성법 | 리턴 값 타입 |
INSTR(STRING, STR, [POSITION,[OCCURRENCE]]) * STRING : 문자 타입 컬럼 또는 문자열 * STR : 찾으려는 문자열 * POSITION : 찾을 위치 시작 값(기본 값 1) POSITION > 0이면 STRING의 시작부터 끝 방향으로 찾고 POSITION < 0이면 STRING의 끝부터 시작 방향으로 찾음 * OCCURRENCE : SUBSTRING이 반복될 때 지정하는 빈도(기본 값 1), 음수 사용 불가 1 = 해당 문자가 첫번째 등장 했을 때 위치를 찾겠다. 2 = 두번째 등장 했을 때 위치를 찾겠다. |
NUMBER |
SELECT INSTR('12345_1234_123_12_1', '_') FROM DUAL; -- 6 SELECT INSTR('12345_1234_123_12_1', '_', 7) FROM DUAL; --11 : 첫 _ 뒤 1 자리(=7) 부터 찾은 값 SELECT INSTR('12345_1234_123_12_1', '_', 1, 2) FROM DUAL; --11 SELECT INSTR('12345_1234_123_12_1', '_', -3) FROM DUAL; --15 SELECT INSTR('12345_1234_123_12_1', '_', -1, 2) FROM DUAL; --15 |
✔ LPAD / RPAD
- 문자열에 임의의 문자열을 왼쪽 / 오른쪽에 덧붙여 길이 N의 문자열 반환
- L : 왼쪽 문자열에 패딩 추가 R : 오른쪽 문자열에 패딩 추가
작성법 | 리턴 값 타입 |
LPAD(STRING, N, [STR]) / RPAD(STRING, N, [STR]) * STRING : 문자 타입 컬럼 또는 문자열 * N : 반환할 문자(열)의 길이(바이트), 원래 STRING의 길이보다 작다면 N만큼 잘라서 표시 * STR : 덧붙이려는 문자(열), 생략 시 공백문자 |
CHARACTER |
✔ 예시 SELECT LPAD(EMAIL, 20, ‘#’) -- 총 20자리 중에 빈 공간을 # 패딩으로 채운다. FROM EMPLOYEE; SELECT RPAD(EMAIL, 20, ‘#’) FROM EMPLOYEE; SELECT LPAD('HI', 6, '*'), RPAD('HELLO', 6, '*') FROM DUAL; SELECT LPAD('하이', 6, '*'), RPAD('안녕', 6, '*') FROM DUAL; --한글은 한글자당 2자리로 인식 **하이 **안녕 --6에 글자수 2씩 더해줘야(6+2) 원하는대로 출력 ****하이 ****안녕 |
✔ LTRIM / RTRIM
- 주어진 컬럼, 문자열의 왼쪽/오른쪽에서 지정한 STR에 포함된 모든 문자를 제거한 나머지 반환
작성법 | 리턴 값 타입 |
LTRIM(STRING, STR) / RTRIM(STRING, STR) * STRING : 문자 타입 컬럼 또는 문자열 * STR : 제거하려는 문자(열), 생략 시 공백문자 |
CHARACTER |
✔ 예시 SELECT EMP_NAME, LTRIM(PHONE, '010'), RTRIM(EMAIL, '@kh.or.kr') FROM EMPLOYEE; |
|
SELECT LTRIM(‘ACABACCKH’, ‘ABC’) FROM DUAL; -- 결과 : KH | |
SELECT LTRIM(‘5782KH’, ‘0123456789’) FROM DUAL; -- 결과 : KH | |
SELECT RTRIM(‘KHACABACC’, ‘ABC’) FROM DUAL; -- 결과 : KH | |
SELECT RTRIM(‘KH5782’, ‘0123456789’) FROM DUAL; -- 결과 : KH |
✔ TRIM
주어진 컬럼, 문자열의 앞/뒤/양쪽에 있는 지정한 문자를 제거한 나머지 반환
작성법 | 리턴 값 타입 |
TRIM( STRING ) TRIM( CHAR FROM STRING) TRIM( LEADING | TRAILING | BOTH [CHAR] FROM STRING) * STRING : 문자 타입 컬럼 또는 문자열 * CHAR : 제거하려는 문자(열), 생략 시 공백문자 * LEADING : TRIM할 CHAR의 위치 지정, 앞(LEADING) / 뒤(TRAILING) / 양쪽(BOTH) 지정 가능 (기본 값 양쪽) |
CHARACTER |
SELECT TRIM(' KH ') FROM DUAL; --KH (공백제거) SELECT TRIM(LEADING 'Z' FROM 'ZZZ123456') FROM DUAL; --123456 SELECT TRIM(LEADING 'Z' FROM 'ZZZ123456Z') FROM DUAL; --123456Z 트림할 CHAR의 위치를 지정한것 앞(LEADING) 지정해서. (안 쓰면 기본값은 BOTH 양쪽이다) ✔ 예시 수행 문장 결과 SELECT TRIM(‘ KH ‘) FROM DUAL; -- 결과 : KH SELECT TRIM(‘Z’ FROM ‘ZZZKHZZZ’) FROM DUAL; -- 결과 : KH SELECT TRIM(LEADING ‘Z’ FROM ‘ZZZ123456’) FROM DUAL; -- 결과 : 123456 SELECT TRIM(TRAILING ‘1’ FROM ‘KH111111’) FROM DUAL; -- 결과 : KH SELECT TRIM(BOTH ‘3’ FROM ‘333KH333333’) FROM DUAL; -- 결과 : KH SELECT TRIM(LEADING ‘2’ FROM ‘222KH222222’) FROM DUAL; -- 결과 : KH222222 |
✔ SUBSTR
컬럼이나 문자열에서 지정한 위치부터 지정한 개수의 문자열을 잘라내어 반환
작성법 | 리턴 값 타입 |
SUBSTR( STRING, POSITION, [LENGTH] ) * STRING : 문자 타입 컬럼 또는 문자열 * POSITION : 문자열을 잘라낼 위치로 양수면 시작방향에서 지정한 수만큼, 음수면 끝 방향에서 지정한 수만큼의 위치 의미 * LENGTH : 반환할 문자 개수(생략 시 문자열의 끝까지 의미, 음수면 NULL 리턴) 오라클에서 위치 찾을 때 1부터 시작하면 됨 |
CHARACTER |
✔ 예시 수행 문장 결과 SELECT SUBSTR('SHOWMETHEMONEY', 5, 2) FROM DUAL; -- 5번째 위치부터 2글자를 잘라라. 결과 : 'ME' SELECT SUBSTR('쇼우 미 더 머니', 2, 5) FROM DUAL; -- 결과 : '우 미 더' (공백 포함한 값) |
✔ LOWER / UPPER / INITCAP
컬럼의 문자 혹은 문자열을 소문자/대문자/단어의 첫 글자만 대문자로(INITCAP) 변환하여 반환
작성법 | 리턴 값 타입 |
LOWER(STRING) / UPPER(STRING) / INITCAP(STRING) * STRING : 문자 타입 컬럼 또는 문자열 |
CHARACTER |
✔ 예시 수행 문장 결과 SELECT LOWER(‘Welcome To My World’) FROM DUAL; -- 결과 : welcome to my world SELECT UPPER(‘Welcome To My World’) FROM DUAL; -- 결과 : WELCOME TO MY WORLD SELECT INITCAP(‘welcome to my world’) FROM DUAL; -- 결과 : Welcome To My World |
✔ CONCAT
컬럼의 문자 혹은 문자열을 두 개 전달 받아 하나로 합친 후 반환 (CONCAT 함수 말고 || 연산자 이용해도 됨)
작성법 | 리턴 값 타입 |
CONCAT(STRING, STRING) * STRING : 문자 타입 컬럼 또는 문자열 |
CHARACTER |
✔ 예시 수행 문장 결과 SELECT CONCAT(‘가나다라’, ‘ABCD’) FROM DUAL; -- 가나다라ABCD SELECT ‘가나다라’ || ‘ABCD’ FROM DUAL; -- 가나다라ABCD |
✔ REPLACE (자바와 동일)
컬럼의 문자 혹은 문자열에서 특정 문자(열)을 지정한 문자(열)로 바꾼 후 반환
작성법 | 리턴 값 타입 |
REPLACE(STRING, STR1, STR2) * STRING : 문자 타입 컬럼 또는 문자열 * STR1 : 변경하려고 하는 문자 혹은 문자열 * STR2 : 변경하고자 하는 문자 혹은 문자열 |
CHARACTER |
✔ 예시 수행 문장 결과 SELECT REPLACE(‘서울시 강남구 역삼동‘, ‘역삼동’, ‘삼성동’) FROM DUAL; 서울시 강남구 삼성동 SELECT REPLACE(‘sun_di@kh.or.kr’, ‘@kh.or.kr’, ‘@gmail.com’) FROM DUAL; sun_di@gmail.com |
숫자 처리 함수
구분 | 설명 | 입력 값 타입 | 리턴 값 타입 |
ABS | 절대 값 리턴 | NUMBER | NUMBER |
MOD | 입력 받은 수를 나눈 나머지 값 반환 | ||
ROUND | 특정 자릿수에서 반올림 | ||
FLOOR | 버림(소수점 아래를 잘라냄) | ||
TRUNC | 특정 자릿수에서 잘라냄 | ||
CEIL | 올림(소수점 아래에서 올림) |
✔ ABS
인자로 전달 받은 숫자의 절대값 반환
작성법 | 리턴 값 타입 |
ABS(NUMBER) * NUMBER : 숫자 혹은 숫자 데이터 컬럼 |
NUMBER |
✔ 예시 수행 문장 결과 SELECT ABS(10.9) FROM DUAL; -- 결과 : 10.9 SELECT ABS(-10.9) FROM DUAL; -- 결과 : 10.9 |
✔ MOD
인자로 전달 받은 숫자를 나누어 나머지 반환
작성법 | 리턴 값 타입 |
MOD(NUMBER, DIVISION) * NUMBER : 숫자 혹은 숫자 데이터 컬럼 * DIVISION : 나눌 수 혹은 나눌 숫자 데이터 컬럼 |
NUMBER |
✔ 예시 수행 문장 결과 SELECT MOD(10, 3) FROM DUAL; -- 결과 : 1 SELECT MOD(-10, 3) FROM DUAL; -- 결과 :-1 |
✔ ROUND
인자로 전달 받은 숫자 혹은 컬럼에서 지정한 위치부터 반올림하여 값 반환
작성법 | 리턴 값 타입 |
ROUND(NUMBER) ROUND(NUMBER, POSITION) * NUMBER : 숫자 혹은 숫자 데이터 컬럼 * POSITION : 반올림할 위치(생략 시 기본 값 0) |
NUMBER |
✔ 예시 수행 문장 결과 SELECT ROUND(10.11) FROM DUAL; -- 결과 : 10 SELECT ROUND(10.123456, 5) FROM DUAL; -- 결과 : 10.12346 |
✔ FLOOR
인자로 전달 받은 숫자 혹은 컬럼에서 소수점 자리의 수를 버림 후 반환
작성법 | 리턴 값 타입 |
FLOOR(NUMBER) * NUMBER : 숫자 혹은 숫자 데이터 컬럼 |
NUMBER |
✔ 예시 수행 문장 결과 SELECT FLOOR(10.11) FROM DUAL; -- 결과 : 10 SELECT FLOOR(-10.61) FROM DUAL; -- 결과 : -11 |
✔ TRUNC
인자로 전달 받은 숫자 혹은 컬럼에서 지정한 위치부터 소수점 자리의 수를 버리고 반환
작성법 | 리턴 값 타입 |
TRUNC(NUMBER, POSITION) * NUMBER : 숫자 혹은 숫자 데이터 컬럼 * POSITION : 버릴 위치(생략 시 기본 값 0) |
NUMBER |
✔ 예시 수행 문장 결과 SELECT TRUNC(123.456) FROM DUAL; -- 결과 : 123 SELECT TRUNC(123.456, 1) FROM DUAL; -- 결과 : 123.4 SELECT TRUNC(123.456, 2) FROM DUAL; -- 결과 : 123.45 SELECT TRUNC(123.456, -1) FROM DUAL; -- 결과 : 120 |
✔ CEIL
인자로 전달 받은 숫자 혹은 컬럼을 올림 후 반환
작성법 | 리턴 값 타입 |
CEIL(NUMBER) | NUMBER |
✔ 예시 수행 문장 결과 SELECT CEIL(10.11) FROM DUAL; -- 결과 : 11 SELECT CEIL(-10.11) FROM DUAL; -- 결과 : -10 |
날짜 처리 함수
구분 | 입력 값 타입 | 리턴 값 타입 | 설명 |
SYSDATE | DATE | 시스템에 저장된 현재 날짜 반환 | |
MONTHS_BETWEEN | DATE | NUMBER | 두 날짜를 전달받아 몇 개월 차이인지 계산하여 반환 |
ADD_MONTHS | DATE | 특정 날짜에 개월 수를 더하여 반환 | |
NEXT_DAY | 특정 날짜에서 인자로 받은 요일이 최초로 다가오는 날짜 반환 | ||
LAST_DAY | 해당 달의 마지막 날짜 반환 | ||
EXTRACT | NUMBER | 년, 월, 일 정보를 추출하여 반환 |
날짜 처리 함수 ex)
--SYSDATE 위치가 최신 시간 입력자리. 순서 바뀌면 음수로 나옴 SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('2021/01/01','yyyy/mm/dd')) FROM DUAL; --8.43~~ 약 8개월 --ABS 앱솔루트로 절대값(양수)로 바꾸고 FLOOR로 소수점버림 SELECT FLOOR(ABS(MONTHS_BETWEEN(TO_DATE('2021/01/01','yyyy/mm/dd'),SYSDATE))) FROM DUAL; SELECT FLOOR(SYSDATE - TO_DATE('2021/01/01','yyyy/mm/dd')) FROM DUAL; --그냥 빼면 일수 차이 SELECT ADD_MONTHS(SYSDATE, 3) FROM DUAL; -- 현재일(9월)로부터 3개월 뒤(더한) 날짜 구하기 SELECT ADD_MONTHS(SYSDATE, 3), TO_CHAR(ADD_MONTHS(SYSDATE, 3), 'yyyy-mm-dd') FROM DUAL; --날짜 보기좋게 순서대로 출력 SELECT SYSDATE + 3, TO_CHAR(ADD_MONTHS(SYSDATE, 3), 'yyyy-mm-dd') FROM DUAL; --그냥 더하면 일수 더하기 --해당 월의 마지막 날짜 SELECT LAST_DAY(SYSDATE) FROM DUAL; --년,월,일 추출 (익스트랙) SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL; SELECT EXTRACT(YEAR FROM TO_DATE('2021-09-21', 'yyyy-mm-dd')) FROM DUAL; -- TO_CHAR로는 불가, 아마 날짜형에서 추출하는 거라서. SELECT EXTRACT(MONTH FROM SYSDATE) FROM DUAL; SELECT EXTRACT(DAY FROM SYSDATE) FROM DUAL; |
시스템 설정
시스템 언어, 시스템 영역 설정
*NLS : oN Line System 의 약자
-- 언어 설정에 따라 에러 발생 ('월요일'로 써서 검색하면 오류) SELECT NEXT_DAY(SYSDATE, 'MONDAY') FROM DUAL; -- 현재 날짜를 기준으로 다음 월요일 날짜가 언제냐 -- 한국어로 설정하기 위한 명령 (일시적으로 변경 된다.) 재접속하면 다시 기본 언어로 변경 됨 ALTER SESSION SET NLS_LANGUAGE = KOREAN; SELECT NEXT_DAY(SYSDATE, '월요일') FROM DUAL; --언어 설정과 무관하게 동작 (권장) -- 1 : 일, 2 : 월, 3 : 화, 4 : 수, 5 : 목, 6 : 금, 7 : 토 SELECT NEXT_DAY(SYSDATE, 2) FROM DUAL; SELECT * FROM NLS_SESSION_PARAMETERS; -- 시스템 설정 종류들, SESSION으로 설정(로그아웃 시 다시 기본설정으로 돌아옴) ALTER SESSION SET NLS_TERRITORY = KOREA; -- 영역 설정 ALTER SESSION SET NLS_TERRITORY = AMERICA; -- 영역 설정 SELECT TO_CHAR(1234567, 'L999,999,999') FROM DUAL; -- 달러기호가 아닌 원화기호로 출력 ALTER SESSION SET NLS_LANGUAGE = KOREAN; -- 언어 설정 ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; --기본 출력 포맷 설정 (TO_CHAR 없이 시간 출력) -- 단, 현재 나의 상태에서만 가능한 것. 다른계정의 기본포맷에서는 다르게 나올 수 있기 때문에 권장X |
타임존 설정
-- 타임존 설정(데이터베이스 한정) [210914 19:20] -- SYSDATE : 시스템의 날짜 정보를 가져오기 때문에 시스템 자체 타임존을 변경하지 않는 이상 -- 데이터베이스 상에서의 시간은 UTC(GMT 표준시 기반)로만 나온다. ALTER DATABASE SET TIME_ZONE = '+09:00'; -- 시스템 계정으로 해야 한다. (재부팅 필요) ALTER SESSION SET TIME_ZONE = 'Asia/Seoul'; SELECT dbtimezone FROM DUAL; ALTER SESSION SET TIME_ZONE = '+09:00'; -- 로그아웃하면 다시 기본 설정으로 돌아옴 ALTER SESSION SET TIME_ZONE = 'Asia/Seoul'; SELECT sessiontimezone FROM DUAL; SELECT TO_CHAR(SYSDATE, 'yyyy/mm/dd/ hh24:mi:ss') FROM DUAL; --hh24 : 12시 기준이 아닌 24시 기준 출력 SELECT TO_CHAR(SYSTIMESTAMP, 'yyyy/mm/dd/ hh24:mi:ss tzr') FROM DUAL; SELECT TO_CHAR(CURRENT_DATE, 'yyyy/mm/dd/ hh24:mi:ss') FROM DUAL; --사용 시스템계정사용해서 재부팅 뒤에 사용 SELECT TO_CHAR(LOCALTIMESTAMP, 'yyyy/mm/dd/ hh24:mi:ss tzr') FROM DUAL; --사용 |
형 변환 함수
구분 | 입력 값 타입 | 리턴 값 타입 | 설명 |
TO_CHAR | DATE NUMBER |
CHARACTER | 날짜형 혹은 숫자형을 문자형으로 변환 |
TO_DATE | CHARACTER NUMBER |
DATE | 문자형 혹은 숫자형을 날짜형으로 변환 |
TO_NUMBER | CHARACTER | NUMBER | 문자형을 숫자형으로 변환 |
NUMBER | --> TO_CHAR <-- TO_NUMBER |
CHARACTER | --> TO_DATE <-- TO_CHAR |
DATE |
✔ TO_CHAR
날짜 혹은 숫자형 데이터를 문자형 데이터로 변환하여 반환 (DATE 또는 NUMBER
작성법 | 리턴 값 타입 |
TO_CHAR(DATE[, FORMAT]) TO_CHAR(NUMBER[, FORMAT]) * DATE : 문자형으로 변환하려는 날짜형 데이터 * NUMBER : 문자형으로 변환하려는 숫자형 데이터 * FORMAT : 문자형으로 변환 시 지정할 출력 형식 |
CHARACTER |
✔ FORMAT 형식 (대소문자 구분 X)
형식 | 의미 | 형식 | 의미 |
YYYY | 년도 표현(4자리) | YY | 년도 표현(2자리) |
MM | 월을 숫자로 표현 | MON | 월을 글자로 표현 |
DAY | 요일 표현 | DY | 요일을 약어로 표현 |
mm | 월 | dd | 일자 |
hh | 시 | mi | 분 |
ss | 초 |
✔ TO_CHAR ex1)
SELECT EMP_NAME, TO_CHAR(HIRE_DATE, 'YYYY-MM-DD'), TO_CHAR(HIRE_DATE, 'YY/MON, DAY, DY') FROM EMPLOYEE; ![]() |
✔ TO_CHAR ex2)
SELECT EMP_NAME -- 원단위 구분기호 찍기 , TO_CHAR(SALARY, 'L999,999,999') -- SALARY 1000이면 $1,000 (L : 지역 화폐단위기호 $, \) 설정 국가 따라 출력 , TO_CHAR(SALARY, '000,000,000') -- SALARY 1000이면 000,001,000 -- , TO_CHAR(SALARY, '999,999,999') SALARY 1000이면 1,000 FROM EMPLOYEE; ![]() |
✔ TO_CHAR ex3)
SELECT TO_CHAR(SYSDATE), TO_CHAR(SYSDATE, 'yyyy') FROM DUAL; --연도로 형 변환한 컬럼 추가 작성 SELECT TO_CHAR(SYSDATE, 'mm'), TO_CHAR(SYSDATE, 'dd') FROM DUAL; --09 | 14 SELECT TO_CHAR(SYSDATE, 'hh'), TO_CHAR(SYSDATE, 'mi') FROM DUAL; -- UTC 기준 시간 (우리나라는 +9시간) SELECT TO_CHAR(SYSDATE, 'mon'), TO_CHAR(SYSDATE, 'day') FROM DUAL; --9월 | 화요일 SELECT TO_CHAR(SYSDATE), TO_CHAR(SYSDATE, 'yyyy') FROM DUAL; SELECT TO_CHAR(SYSDATE, 'yyyy/mm/dd hh:mi:ss') FROM DUAL; SELECT TO_CHAR(1234567) FROM DUAL; SELECT TO_CHAR(1234567, '000,000,000') FROM DUAL; SELECT TO_CHAR(1234567, '999,999,999') FROM DUAL; SELECT TO_CHAR(1234567, 'L999,999,999') FROM DUAL; |
✔ TO_DATE, TO_CHAR, TO_DATE ex)
[210914 19:40] SELECT TO_DATE('2021-09-14', 'yyyy-mm-dd') FROM DUAL; --기호 상관 없음 형식 맞추기만 하면 됨 SELECT TO_DATE('2021/09/14', 'yyyy/mm/dd') FROM DUAL; --기호 상관 없음 형식 맞추기만 하면 됨 SELECT TO_DATE('20210914', 'yyyymmdd') FROM DUAL; --기호 상관 없음 형식 맞추기만 하면 됨 SELECT TO_DATE('2021년 09월 14일', 'yyyy"년" mm"월" dd"일"') FROM DUAL; -- 쌍 따옴표 중요! --'09:14:30' 형태의 문자를, 'hh:mi:ss' 형식(포맷)의 DATE(날짜형 데이터)로 리턴 --그리고 그 날짜형 데이터를 TO_CHAR로 'hh:mi:ss' 형식(포맷)의 문자형 데이터로 변환 SELECT TO_CHAR(TO_DATE('09:14:30', 'hh:mi:ss'), 'hh:mi:ss') FROM DUAL; SELECT TO_CHAR(TO_DATE('15:14:30', 'hh24:mi:ss'), 'hh:mi:ss') FROM DUAL; SELECT TO_CHAR(TO_DATE('15:14:30', 'hh24:mi:ss'), 'am hh:mi:ss') FROM DUAL; -- am, pm 표기까지 가능한 포맷 적용 SELECT TO_DATE(20210914, 'yyyymmdd') FROM DUAL; SELECT TO_DATE(210914, 'yymmdd') FROM DUAL; -- RR : 2 자리 년도의 변호나에 사용하는 포맷 -- 00 ~ 49 -> 2000 ~ 2049 년도로 인식 -- 50 ~ 99 -> 1950 ~ 1999 년도로 인식 --문자열을 숫자타입으로 변환 SELECT TO_NUMBER('10000') FROM DUAL; -- 이럴 땐 그냥 하면 되지만 콤마가 있다면 에러 SELECT TO_NUMBER('10,000', '999,999') FROM DUAL; --문자열이 있고 숫자 포맷 형태로 저장 SELECT TO_NUMBER('$10,000', 'L999,999') FROM DUAL; -- 영역설정 AMERICA SELECT TO_NUMBER('₩10,000', 'L999,999') FROM DUAL; -- 영역설정 KOREA ㄹ한자 원화기호 SELECT TO_NUMBER('FF', 'XX') FROM DUAL; -- 16진수 10진수로 변환 SELECT TO_NUMBER('12AC4F', 'XXXXXX') FROM DUAL; -- 16진수 10진수 변환 'XXXXXX'로 자릿수 맞춤, 다 16진수라는 의미 |
NULL 처리 함수
✔ NVL
NULL로 되어 있는 컬럼의 값을 인자로 지정한 숫자 혹은 문자로 변경하여 반환
작성법 | 리턴 값 타입 |
NVL(P1, P2) * P1 : NULL데이터를 처리할 컬럼명 혹은 값 * P2 : NULL값을 대체하고자 하는 값 |
NUMBER CHARACTER |
[210914 20:45] SELECT NVL(NULL, '없음'), NVL('HELLO', '없음') FROM DUAL; --NULL의 대체 값 지정 함수 SELECT DEPARTMENT_ID, NVL(DEPARTMENT_ID, 0) FROM EMPLOYEES WHERE DEPARTMENT_ID IS NULL; -- ID가 숫자타입이므로 0으로 타입 맞춤 |
✔ NVL2
- - NVL2(exp, exp1, exp2)
- - exp의 값이 NULL이 아닐 경우에는 exp1의 값을 반환 하고, NULL일 경우에는 exp2의 값을 반환 한다.
--널인경우에는 없음(2번째값)으로 널이 아닌 경우에는 1번째 매개변수값(있음)으로 SELECT NVL2(NULL, '있음', '없음'), NVL2('HELLO', '있음', '없음') FROM DUAL; SELECT DEPARTMENT_ID, NVL(DEPARTMENT_ID, 1, -1) FROM EMPLOYEES WHERE DEPARTMENT_ID IS NULL; --부서 있으면 1 없으면 -1 --얘는 타입 안 맞춰줘도 됨, ID 숫자타입인데 한글 반환 가능 SELECT DEPARTMENT_ID, NVL2(DEPARTMENT_ID, '부서있음', '부서없음') FROM EMPLOYEES; --부서있음 SELECT DEPARTMENT_ID, NVL2(DEPARTMENT_ID, '부서있음', '부서없음') FROM EMPLOYEES WHERE DEPARTMENT_ID IS NULL; --WHERE에서 NULL인 곳 뽑은거니까 부서 없음 |
선택 함수
✔ DECODE
비교하고자 하는 값 또는 컬럼이 조건식과 같으면 결과 값 반환
작성법 | 리턴 값 타입 |
DECODE(표현식, 조건1, 결과1, 조건2, 결과2, …, DEFAULT) * 표현식 : 값에 따라 선택을 다르게 할 컬럼 혹은 값 * 조건 : 해당 값이 참인지 거짓인지 여부 판단 * 결과 : 해당 조건과 일치하는 경우 반환할 값 * DEFAULT : 모든 조건이 불일치 시 반환할 값 |
결과 |
--첫번째 인자의 값이 2번째 인자의 값이면 세번째 인자 값을 반환시켜주는 함수 일종의 if문 마지막 인자는 else에 해당 SELECT DECODE('A', 'A', 65, 'B', 66, 'C', 67, 0) AS COL1 , DECODE('B', 'A', 65, 'B', 66, 'C', 67, 0) AS COL2 , DECODE('C', 'A', 65, 'B', 66, 'C', 67, 0) AS COL3 , DECODE('D', 'A', 65, 'B', 66, 'C', 67, 0) AS COL4 FROM DUAL; -- if('A'=='A'){ -- print(65); --}else if('B' == 'B'){ -- print(66); --}else{ -- print(0); --} SELECT REGION_ID -- ID가 1이면 유럽 2면 아메리카 3이면 아시아 4면 중앙아시아 아니면 아프리카 , DECODE(REGION_ID, 1, '유럽', 2, '아메리카', 3, '아시아', 4, '중앙아시아', '아프리카') FROM REGIONS; |
✔ CASE
비교하고자 하는 값 또는 컬럼이 조건식과 같으면 결과 값 반환(조건은 범위 값 가능)
작성법 | 리턴 값 타입 |
CASE WHEN 조건1 THEN 결과1 WHEN 조건2 THEN 결과2 WHEN 조건3 THEN 결과3 … ELSE 결과N END * 조건 : 해당 값이 참인지 거짓인지 여부 판단 * 결과 : 해당 조건과 일치하는 경우 반환할 값 * DEFAULT : 모든 조건이 불일치 시 반환할 값 |
결과 |
SELECT SALARY --SALARY 컬럼 같이 출력하면 보기 좋으니까 , CASE WHEN SALARY <= 3000 THEN '낮은급여' WHEN SALARY >= 8000 THEN '높은급여' ELSE '높은급여' END FROM EMPLOYEES; --SELECT CASE WHEN 조건식 THEN 반환값 -- ELSE 반환값 -- END -- FROM EMPLOYEES; --END : CASE WHEN 종료 구문(꼭) |