Oracle

[210914] 함수(Function), 시스템 설정 (언어, 영역, 타임 존)

감자탈출기 2021. 9. 14. 22:24
  • 함수 기능을 테스트할 때 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''_'7FROM DUAL;             --11 : 첫 _ 뒤 1 자리(=7) 부터 찾은 값
SELECT INSTR('12345_1234_123_12_1''_'12FROM DUAL;          --11
SELECT INSTR('12345_1234_123_12_1''_', -3FROM DUAL;            --15
SELECT INSTR('12345_1234_123_12_1''_', -12FROM 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(SYSDATETO_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(SYSDATE3FROM DUAL-- 현재일(9월)로부터 3개월 뒤(더한) 날짜 구하기 
SELECT ADD_MONTHS(SYSDATE3), TO_CHAR(ADD_MONTHS(SYSDATE3), 'yyyy-mm-dd'FROM DUAL;  --날짜 보기좋게 순서대로 출력

SELECT SYSDATE + 3TO_CHAR(ADD_MONTHS(SYSDATE3), 'yyyy-mm-dd'FROM DUAL--그냥 더하면 일수 더하기 


--해당 월의 마지막 날짜
SELECT LAST_DAY(SYSDATEFROM DUAL;

--년,월,일 추출 (익스트랙)
SELECT EXTRACT(YEAR FROM SYSDATEFROM DUAL;
SELECT EXTRACT(YEAR FROM TO_DATE('2021-09-21''yyyy-mm-dd')) FROM DUAL;
-- TO_CHAR로는 불가, 아마 날짜형에서 추출하는 거라서.
SELECT EXTRACT(MONTH FROM SYSDATEFROM DUAL;
SELECT EXTRACT(DAY FROM SYSDATEFROM 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(SYSDATE2FROM 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(1234567FROM 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_IDNVL(DEPARTMENT_ID0FROM 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_IDNVL(DEPARTMENT_ID1, -1FROM EMPLOYEES WHERE DEPARTMENT_ID IS NULL
--부서 있으면 1 없으면 -1

--얘는 타입 안 맞춰줘도 됨, ID 숫자타입인데 한글 반환 가능 
SELECT DEPARTMENT_IDNVL2(DEPARTMENT_ID'부서있음''부서없음'FROM EMPLOYEES;  --부서있음
SELECT DEPARTMENT_IDNVL2(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'670AS COL1
     , DECODE('B''A'65'B'66'C'670AS COL2
     , DECODE('C''A'65'B'66'C'670AS COL3
     , DECODE('D''A'65'B'66'C'670AS 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_ID1'유럽'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 종료 구문(꼭)