형변환
- 묵시적 변환
SELECT 1 + '1' FROM dual;
여기서 '1'은 문자지만, DBMS에서 숫자로 된 ‘문자’는 산술 연산시 자동적으로 숫자로 변환해준다.
이를 묵시적 형변환이라고한다. 편리한것 같지만 내부적으로 DB에 뜻하지 않은 성능저하를 가져올 수 있다.
또한 숫자로된 문자가 아닌 일반 문자는 연산할 수 없으므로 에러가 발생한다.
- 명시적 변환
자동형변환의 예제를 보자.
SELECT 1 + '1' FROM dual;
'1'에 대해 문자로된 숫자이므로 자동적으로 산술연산이 가능하게 형변환을 실행했다.
내부적으로는 SELECT 1 + to_number('1') FROM dual; 처럼 형변환 함수가 호출되며,
이와같은 형변환 함수를 명시해서 형변환하는 것을 명시적 변환이라고 한다. 3
형변환 함수의 종류
형변환 함수는 크게 TO_CHAR, TO_NUMBER, TO_DATE 세가지로 나누어진다.
1) TO_CHAR 함수
(1) TO_CHAR(날짜, 원하는 모양 ); 날짜 --> 문자
* 연도표현
SELECT SYSDATE,
TO_CHAR(SYSDATE, 'YYYY') 연도4자리,
TO_CHAR(SYSDATE, 'RRRR') 연도Y2K버그이후,
TO_CHAR(SYSDATE, 'YY') 연도2자리,
TO_CHAR(SYSDATE, 'YEAR') 연도영문
FROM dual;
* 월 표현
SELECT TO_CHAR(SYSDATE, 'MM') 월2자리,
TO_CHAR(SYSDATE, 'MON') 월3자리,
TO_CHAR(SYSDATE, 'MONTH') 월전체,
TO_CHAR(SYSDATE, 'MON', 'NLS_DATE_LANGUAGE=ENGLISH') 월3자리,
TO_CHAR(SYSDATE, 'MONTH', 'NLS_DATE_LANGUAGE=ENGLISH') 월전체
FROM dual;
* 일 표현
SELECT TO_CHAR(SYSDATE, 'DD') 일숫자2자리,
TO_CHAR(SYSDATE, 'DDTH') 몇번째날,
TO_CHAR(SYSDATE, 'DAY') 요일,
TO_CHAR(SYSDATE, 'Dy') 요일
FROM dual;
* 시분초 표현
SELECT TO_CHAR(SYSDATE, 'HH24') 24시간체계,
TO_CHAR(SYSDATE, 'HH') 12시간체계,
TO_CHAR(SYSDATE, 'MI') 분,
TO_CHAR(SYSDATE, 'SS') 초
FROM dual;
* 예제
Ex) SELECT SYSDATE, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') 날짜 FROM dual;
Ex) '2019년09월19일20시28분03초'출력하려면?
SELECT SYSDATE,
TO_CHAR(SYSDATE, 'YYYY"년"MM"월"DD"일" HH"시"MI"분"SS"초"') 날짜
FROM dual;
* 한글은 인식문제로 " " 사이에 넣어야함
Ex) t_student 테이블의 생일(birthday)이 3월인 학생의 이름(name) 과 생일(birthday)을 출력하라
= SELECT NAME, TO_CHAR(birthday, 'YYYY-MM-DD') 생일
FROM t_student
WHERE TO_CHAR(birthday,'MM')='03';
(2) TO_CHAR(숫자값, 원하는 모양 ); 숫자 --> 문자
SELECT TO_CHAR(1234, '99999') "9하나당 1자리",
TO_CHAR(1234, '099999') "빈자리 0으로",
TO_CHAR(1234, '$9999') "$붙임",
TO_CHAR(1234, '9999.99') "소수점이하",
TO_CHAR(1234, '99,999') "천단위구분기호"
FROM dual;
Ex) professor 테이블에서 101번 학과 교수들의 이름(name), 연봉(pay)을 출력하라
단, 연봉은 (pay * 12) + bonus로 계산하고 천단위 구분기호로 표시
= SELECT NAME, TO_CHAR( (pay*12) + NVL(bonus,0), '99,999') 연봉
FROM t_professor WHERE deptno=101;
2) TO_NUMBER 함수
TO_NUMBER(문자);
3) TO_DATE 함수
TO_DATE(문자, 날짜포맷);
Ex) SELECT TO_DATE('2012-01-01', 'YY/MM/DD') "TODATE함수"
FROM dual;
Ex) t_professor 테이블에서 2000년 이전에 입사한 교수명과 입사일, 현재 연봉과 10% 인상 후 연봉을 출력하라
단, 연봉은 보너스(bonus)를 제외한 pay * 12 로 계산하고 연봉과 인상후 연봉은 천단위 구분 기호를 추가하여 출력
= SELECT name,
TO_CHAR(hiredate, 'YYYY-MM-DD') 입사일,
TO_CHAR(pay*12, '999,999') 연봉,
TO_CHAR(pay*12*1.1, '999,999') 인상후
FROM t_professor
WHERE TO_NUMBER(TO_CHAR(hiredate, 'YYYY')) <= 2000;
(-- 또는 WHERE hiredate < '2000-01-01'; )
'SQL > Oracle' 카테고리의 다른 글
10_SQL함수(6) 그룹함수 (0) | 2019.09.24 |
---|---|
09_SQL함수(5) 단일행함수: 날짜함수 (0) | 2019.09.22 |
07_SQL함수(2) 단일행함수: 일반함수(NVL, NVL2) (0) | 2019.09.22 |
06_SQL함수(1) 단일행함수: 문자함수 (0) | 2019.09.20 |
05 _ SQL기초 (4) Select문 사용과 WHERE 조건절 (0) | 2019.09.18 |