ORACLE 오라클 TO_CHAR 함수 사용법 완벽한 정리 (날짜포맷, 소수점, 천단위 콤마)
참고 : https://gent.tistory.com/331
숫자나 날짜를 문자로 변환해 주는 함수가 바로 TO_CHAR로, 매개변수로는 숫자나 날짜가 올 수 있고 반환 결과를 특정 형식에 맞게 출력할 수 있다.
SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') --20200723
, TO_CHAR(SYSDATE, 'YYYY/MM/DD') --2020/07/23
, TO_CHAR(SYSDATE, 'YYYY-MM-DD') --2020-07-23
, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') --2020-07-23 11:10:52
FROM dual
SELECT TO_CHAR(3, 'FM999.999') --3.
, TO_CHAR(6, 'FM0000.00') --0006.00
, TO_CHAR(0.12345, 'FM9990.99') --0.12
FROM dual
FM: 문자열의 공백제거
숫자의 최대 길이만큰 9999... 형식을 지정한다. (9 : 값이 없으면 표시안함, 0: 값이 없으면 "0"으로 처리)
정수은 지정한 형식보다 값의 길이가 길면 오류, 소수 지정한 길이보다 길면 반올림
SELECT TO_CHAR(123467, 'FM999,999') --123,467
, TO_CHAR(123467890, 'FM999,999,999') --123,467,890
, TO_CHAR(123467, 'FML999,999') --₩123,467
FROM dual
SELECT TO_CHAR(123) --123
, TO_CHAR(123, 'FM00000') --00123
FROM dual
SELECT TO_CHAR(SYSDATE, 'MM/DD') --01/02
, TO_CHAR(SYSDATE, 'FMMM/DD') --1/2
FROM dual
SELECT TO_CHAR(SYSDATE, '""YYYY"년 "MM"월 "DD"일"') --2023년 01월 02일
, TO_CHAR(SYSDATE, '""HH24"시 "MI"분 "SS"초"') --20시 37분 54초
FROM dual
SELECT TO_CHAR(SYSDATE, 'AM') --오전
, TO_CHAR(SYSDATE, 'AM HH:MI:SS') --오전 11:44:31
, TO_CHAR(SYSDATE, 'YYYY-MM-DD AMHH:MI:SS') --2020-07-23 오전11:44:31
FROM dual
SELECT TO_CHAR(SYSDATE, 'D') --2 : 1(일)~7(토)
, TO_CHAR(SYSDATE, 'DY') --월
, TO_CHAR(SYSDATE, 'DAY') --월요일
FROM dual
SELECT TO_CHAR(SYSDATE, 'DDD') --365일 기준 002일
, TO_CHAR(SYSDATE, 'WW') --1년 기준 01주
, TO_CHAR(SYSDATE, 'Q') --1분기
FROM dual
SELECT TO_CHAR(SYSDATE, 'MON') --1월
, TO_CHAR(SYSDATE, 'DL') --2023년 1월 2일 월요일
FROM dual
참고 : https://gent.tistory.com/424
오라클에서 문자열을 숫자형으로 변환하기 위해서는 TO_NUMBER 함수와 CAST 함수를 사용할 수 있다.
SELECT TO_NUMBER('1123231') AS NUM1
, TO_NUMBER('1238908') AS NUM2
FROM dual
SELECT CAST('12345' AS NUMBER(10))
, CAST('12345.56' AS NUMBER(10))
, CAST('12345.56' AS NUMBER(10,2))
FROM dual
SELECT REPLACE('$123,456', '$') AS result1
FROM dual
SELECT ROWNUM
, a.*
FROM V_WPPIMINFO a
SELECT ROWNUM
, x.*
FROM ( SELECT a.*
FROM ZZANMUSER a
ORDER BY a.USR_ID
)x
ORDER BY 된 결과에 순번을 매길때에는 ROWNUM 보다 ROW_NUMBER() 함수가 더 편하다.
SELECT ROW_NUMBER() OVER(ORDER BY a.USR_ID, a.KOR_NM) row_num
, a.*
FROM ZZANMUSER a
ORDER BY a.USR_ID, a.KOR_NM
SELECT DISTINCT
a.PATNO
, b.PAT_NM
FROM GXEXRGEXM a
, V_WPPIMINFO b
WHERE a.PATNO= b.PATNO
SELECT
PAT_NM
,MAX(FINL_VIST_SN) AS MAX1
,MIN(FINL_VIST_SN) AS MIN1
FROM V_WPPIMINFO
GROUP BY PAT_NM
ORDER BY MAX1 DESC, MIN1
오라클에서 if 문과 비슷한 기능을 하는 DECODE 함수가 있다. 그러나 DECODE 함수는 조건이 많아지면 가독성이 떨어지고 복잡해지며, 가장 큰 문제는 오라클 SQL에서만 사용할 수 있는 비표준 함수이다.
오라클에서 DECODE 함수를 대체할 수 있는 기능이 CASE 표현식이며 가독성이 좋고 더 많은 기능을 제공한다. 조건이 복잡한 경우 DECODE 함수 보다 CASE 표현식을 사용할 것을 권장한다.
SELECT PATNO
, ROAD_NM_ADDR_YN
, CASE WHEN ROAD_NM_ADDR_YN = 'Y' THEN '도로명 주소 있음'
WHEN ROAD_NM_ADDR_YN = 'N' THEN '도로명 주소 없음'
ELSE null
END AS ROAD_ADDR
FROM V_WPPIMINFO
SELECT PAT_NM
, FINL_VIST_SN
, CASE WHEN FINL_VIST_SN >= 100 THEN '아픈환자'
WHEN FINL_VIST_SN >= 50 THEN '중간환자'
WHEN FINL_VIST_SN >= 10 THEN '안아픈 환자'
WHEN FINL_VIST_SN >= 0 THEN '방문한 사람'
ELSE NULL
END AS PAT_GRADE
FROM V_WPPIMINFO