Oracle 서버에서
NUMBER나 DATE는 VARCHAR2 또는 CHAR로 자동으로 변환가능
CHAR -> DATE : TO_DATE
CHAR -> NUMBER : TO_NUMBER
DATE -> CHAR : TO_CHAR
NUMBER -> CHAR : TO_CHAR
TO_CHAR(date|, 'format model'|)
SELECT SYSDATE
,TO_CHAR(SYSDATE, 'YYYY')
,TO_CHAR(SYSDATE, 'MM/DD')
,TO_CHAR(SYSDATE, 'Month DD, YYYY')
FROM dual ;
/*
2025/05/23 21:37:54
2025
05/23
5월 23, 2025
*/
-- language를 영어로 바꿈
ALTER SESSION SET NLS_LANGUAGE = AMERICAN ;
SELECT last_name,
TO_CHAR(hire_date, 'fmDD Month YYYY'),
TO_CHAR(hire_date, 'DD Month YYYY')
FROM employees;

spth를 붙여줌TO_CHAR(number|, 'format model'|)
9: 숫자를 나타냄
0: 0이 표시되도록 강제 적용
$: 부동 달러 기호 배치
L: 부동 로컬 통화 기호 사용
.: 소수점 출력
,: 천 단위 표시자로 쉼표 출력
SELECT last_name, salary
,TO_CHAR(salary, '$99,999.00')
,TO_CHAR(salary, '$00,000.00')
FROM employees ;
SELECT last_name, salary
,TO_CHAR(salary, 'L99,999.00')
FROM employees ;
SELECT TO_NUMBER('$15,000','$99,999') + TO_NUMBER('$20,000','$99,999')
FROM dual ;
SELECT '01-JAN-21'
,TO_DATE('01-JAN-21','DD-MON-RR')
FROM dual ;
SELECT last_name, hire_date
FROM employees
WHERE hire_date = TO_DATE('June 17, 1987', 'Month DD, YYYY');
-- 공백까지 모두 일치해야 결과가 나옴(fx수정자 사용)
SELECT last_name, hire_date
FROM employees
WHERE hire_date = TO_DATE('June 17, 1987', 'fxMonth DD, YYYY');
SELECT last_name, hire_date
FROM employees
WHERE hire_date = TO_DATE('June 17, 1987', 'fxMonth DD, YYYY');
ㄴ fx 수정자를 가짐(딱히 쓰임새가 있지는 x)
임의의 데이터 유형을 사용하며, null 사용과 관련있음
NVL(expr1, expr2)
NVL2(expr1, expr2, expr3)
NULLIF(expr1, expr2)
COALESCE(expr1, expr2, ..., exprn)
null 값을 실제 값으로 변환
null인 경우만 가능
데이터 유형이 일치해야 함SELECT last_name, commission_pct, NVL(commission_pct,0)
FROM employees
WHERE department_id IN (50, 80) ;
SELECT last_name, salary, commission_pct
,(salary*12) + ((salary*12)*commission_pct)
,(salary*12) + ((salary*12)*NVL(commission_pct,0))
FROM employees
WHERE department_id IN (50, 80) ;
NVL함수에서 확장됨
null인 경우와 null이 아닌 경우 모두 조절 가능
두 값이 같으면, null 리턴
같지 않으면, 첫번째 표현식의 결과를 리턴
CASE expr WHEN comparison expr1 THEN return expr1 [WHEN comparison expr2 THEN return expr2 WHEN comparison exprn THEN return exprn ELSE else_expr] END
SELECT last_name, job_id, salary,
CASE job_id WHEN 'AD_PRES' THEN salary * 1.1
WHEN 'AD_VP' THEN salary * 1.15
WHEN 'IT_PROG' THEN salary * 1.2
ELSE salary * 1.05 END AS new_salary
FROM employees ;
SELECT last_name, job_id, salary,
CASE WHEN job_id = 'AD_PRES' THEN salary * 1.1
WHEN job_id = 'AD_VP' THEN salary * 1.15
WHEN job_id = 'IT_PROG' THEN salary * 1.2
ELSE salary * 1.05 END AS new_salary
FROM employees ;
SELECT last_name, job_id, salary,
CASE WHEN salary <= 5000 THEN '평균 이하'
WHEN salary <= 10000 THEN '평균'
WHEN salary <= 20000 THEN '평균 이상'
ELSE '최상급' END AS grade
FROM employees ;
같은 값만 비교할 수 있음 --> 그래서 CASE문을 더 많이 씀
DECODE(column, 조건1, 출력1, 조건2, 출력2, ..., 출력_fin)
SELECT last_name, job_id, salary,
DECODE(job_id, 'AD_PRES' ,salary * 1.1
, 'AD_VP' ,salary * 1.15
,'IT_PROG' ,salary * 1.2
,salary * 1.05) AS new_salary
FROM employees ;