뇨내

[Oracle - SQL Developer] Casting 형변환 본문

Oracle/Casting + Sequence + Constraint

[Oracle - SQL Developer] Casting 형변환

삐옥 2021. 11. 16. 23:58

 

 

 

 

 

 

 

 

 

 

 


 

 

 

Casting 형변환

 

1. to_char()          : 숫자 -> 문자
2. to_char()          : 날짜 -> 문자
3. to_number()   : 문자 -> 숫자
4. to_date()          : 문자 -> 날짜

 

 

 

 

 

 

 

 


 

 

 

 

to_char()  : 숫자 → 문자

 

 to_char(컬럼명, '형식문자열')

 

형식문자열 구성요소 (숫자 -> 문자)
1.   9    : 숫자 1개를 문자 1개로 바꾸는 역할(빈자리는 버린다. = 공백으로 표현됨), 부호 자리를 확보 
2.   0    : 숫자 1개를 문자 1개로 바꾸는 역할(빈자리는 0으로 채운다) 
3.   $    : 통합 기호 표현
4.   L    : 통화기호 표현(로컬) > 설정에 따라 변함
5.   .     : 소수점 표시   
6.   ,     : 자릿수 표시

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
--=========================================
-- 9, 0
select 
    weight,                                             -- 우측정렬
    '@' || to_char(weight) || '@',                      -- 좌측정렬, 간접적으로 형변환 확인!
    '@' || to_char(weight, '999'|| '@',               -- 999 = **3개의 자리**를 확보하라는 의미 
    --'@' || to_char(weight*-1, '999') || '@'           -- 부호자리 확보 확인용, 앞에 공백이아닌 부호자리 확보용 이었음
    --'@' || substr(to_char(weight, '999'), 2 ) || '@'  -- 좋은 방법은 아님, 마이너스를 날려버림
    '@' || to_char(weight, '00000'|| '@',             -- 공백을 0으로 채움
    '@' || to_char(weight, '99'|| '@'                 -- ### 이런식으로 나옴 => 숫자의 최대자리수를 알아야 한다는 의미
from tblComedian;
 
--=========================================
-- $, L
select
    100,
    to_char(100'999'),
    '$' || to_char(100'999'),
    to_char(100'$999'),
    to_char(100'L999')
from dual;
 
--==========================================    
-- '.', ','
 
select
    123.456,
    to_char(123.456'999999'),
    to_char(123.456'999.999'),
    to_char(123.456'9999.99'-- 반올림도 됨
from dual;
 
 
select
    123456789,
    to_char(123456789),
    to_char(123456789'999,999,999'), -- sql은 직접 ',' 찍어야함
    to_char(123456789'9,9999,9999')
from dual;
 
--==========================================
cs

 

 

 

 

 


 

 

 

to_char() : 날짜 → 문자

 

- 형변환보다는, 날짜의 일부 요소를 원하는 형태로 추출하는 역할★

 

char to_char(컬럼명, '형식 문자열')

 

형식 문자열 구성요소

1.    yyyy
2.    yy
3.    month
4.    mon
5.    mm
6.    day
7.    dy
8.    ddd
9.    dd
10.  d
11.  hh
12.  hh24
13.  mi
14.  ss
15.  am(pm)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
select sysdate from dual; --베이스
 
select to_char(sysdate, 'yyyy')from dual;   --2021, 년(4자리) 사용 多 *****
select to_char(sysdate, 'yy')from dual;     --21, 년(2자리)
select to_char(sysdate, 'month')from dual;  --11월(풀네임)
select to_char(sysdate, 'mon')from dual;    --11월(약어)
select to_char(sysdate, 'mm')from dual;     --11(2자리) *****
select to_char(sysdate, 'day')from dual;    --월요일(풀네임)
select to_char(sysdate, 'dy')from dual;     --월(약어)
select to_char(sysdate, 'ddd')from dual;    --319(일, 올해의 며칠)
select to_char(sysdate, 'dd')from dual;     --15 (일, 이번월의 며칠) *****
select to_char(sysdate, 'd')from dual;      --2  (일, 이번주의 며칠 = 요일) 
select to_char(sysdate, 'hh')from dual;     --10, 시(12H)
select to_char(sysdate, 'hh24')from dual;   --10, 시(24H) *****
select to_char(sysdate, 'mi')from dual;     --40, 분 *****
select to_char(sysdate, 'ss')from dual;     --58, 초 *****
select to_char(sysdate, 'am')from dual;     --오전
select to_char(sysdate, 'pm')from dual;     --오전
 
cs

 

1
2
3
4
5
6
7
8
9
10
select
    sysdate, --RR/MM/DD ***** 이 표현은 클라이언트툴에 따라 다름
    to_char(sysdate,'yyyy-mm-dd') as hour, -- ***** 이 표현은 모든 클라이언트툴에 동일하게 나옴 왜? 강제 변환을 시킨 것이므로
    -- 그래서 위의 방법으로 써야함!!!!***
    to_char(sysdate, 'hh24:mi:ss') as min,
    to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') as time,
    to_char(sysdate, 'day am hh:mi:ss') as "가끔" -- 형식문자열에는 공백, 대시, 콜론만 허용범위임
    --to_char(sysdate, 'day am hh시mi분ss초) as "가끔" -- X
from dual;
 
cs

 

 

 

 


 

 

to_number()

 

to_number(컬럼명)

 

1
2
3
4
5
6
7
8
9
10
11
12
select 
    '123' as "AAAAAAAAAAAAAAAAAAAA"
    to_number('123') as "AAAAAAAAAAAAAAAAAAAA" 
    --정렬 볼려고 alias 이렇게 넓게한것
from dual;
 
 
 
select 
    '123'*2 as "AAAAAAAAAAAAAAAAAAAA"-- 문자열 * 2 > 작동함 > 암시적 형변환 발생
    to_number('123'*2 as "AAAAAAAAAAAAAAAAAAAA"
from dual;
cs

 

 

좌문자열, 우숫자

 


 

 

 

to_date()

 

to_date(컬럼명, 형식 문자열)

 

SQL은 날짜 상수를 문자열 상수를 통해서 만든다 (by 문맥)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
select * from tblInsa where join > '2015-01-01'-- 날짜(date)와 비교중 > 암시적으로 형변환
select name, '2015-01-01', sysdate from tblCompany; -- 이 때의 '2015-01-01'은 문자열. 이거는 날짜가 아니고 형변환x
select name, '2021-11-16' - join from tblCompany; -- X
 
 
 
select * from tblCompany where join > '2015-01-01';
select * from tblCompany where join > to_date('2015-01-01');
 
select name, '2015-01-01', sysdate from tblCompany;
select name, to_date('2015-01-01'), sysdate from tblCompany;
 
select * from tblCompany
    where join > to_date('2015-01-01 12:00:00''yyyy-mm-dd hh24:mi:ss');
 
 
select name,' 2021-11-16' - join from tblCompany;
select name, to_date('2021-11-16'- join from tblCompany;
cs

 

 

 


 

 

*추가

NULL 관련 함수

 

nvl(expr1, expr2)


null value

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
select 
    name, 
    case
        when population is not null then population
        when population is null then -1 --문자넣으면 에러, 하나의 컬럼은 자료형이 똑같아야 한다.
    end
from tblCountry; 
 
 
select name, nvl(population, 999from Country; --nvl() 사용 예시
 
select name, nvl(tel,'연락처없음'from tblMember; --일종의 null인 값에 대한 replace!
 
 
-- nvl2(expr1, expr2, expr3)
select name, tel, nvl2(tel, 'AAA','BBB'from tblMember;
select name, nvl2(tel, '연락처 있음''연락처 없음'from tblMember;
 
select
    name,
    case
        when tel is null then '연락처 없음'
        when tel is not null then '연락처 있음'
    end
from tblMember;
cs

 

 

 

 


 

 

Comments