기본 콘텐츠로 건너뛰기

1월, 2016의 게시물 표시

0.1 + 0.2 == 0.30000000000000004

이번 글을 보는 사람들은 이미 0.1 + 0.2의 결과를 보고 당황스러움을 경험했을듯 싶다. 눈을 의심해봤자 소용없다. 컴퓨터는 0.1 + 0.2를 계산하지못한다는걸 받아들이자. 조금더 정확하게 얘기하면 2진수는 10진수 0.1을 정확하게 변경 할 수 없게끔 만들어졌다. 이유는 다음과 같다. 우선, 몸풀기로 10진수 정수를 2진수로 변환해보면 5(10) -> 101(2) = 2^2 + 2^0 이다. 그럼 소수를 다뤄보자 0.5(10)을 2진수로 변경하면 0.1(2)이 된다. 뒤에 0.1은 2^-1 이다. 그러므로 0.01(2) -> 2^-2 -> 0.25 이다. 반면에 0.1(10)은 0.0001100110011... (2) 이다. (1/3을 십진수로 표시못하는 이유와 비슷하다) 즉 소수부분이 순환소수가 아니라 딱 떨어지는 수가 되려면 An = 1/2n 으로 표현되는 수들의 합으로 이루어지는 수가 되어야하고 그렇지 않는 수들은 전부 반올림이 필요한 소수가 된다. 결론적으로 소수 연산이 필요하다면 우선 정수로 변환을 해서 계산을하고 소수로 변경해줘야 할 듯 싶다.

[오라클] update, insert 한번에 (merge into)

두번할꺼 한번에 해주는 편한기능이다. 그렇다고 모든 insert나 update를 이렇게 할필요는 없다. '걍 insert 하믄 되지 뭘 왜 select를 하구있어' 라는 소리를 들을수도 있다. 보통 개발진행중이거나, 배치작업같은데서 종종 필요할듯 싶다. MERGE INTO RequestTable RT -- 이번 쿼리의 대상이 되는 테이블 USING JoinTable JT -- 조인이 필요한 테이블 ON (RT.col1 = JT.col1..) -- 조인조건 WHEN MATCHED THEN -- 조건에 합당할경우 / 데이터가 있는경우 UPDATE SET -- updqte, set 사이에 테이블명을 명시하지 않음 RT.col2 = JT.col2 ,RT.col3 = JT.col3 ,RT.col4 = JT.col4 WHEN NOT MATCHED THEN -- 조건에 안맞음 / 데이터가 없는경우 INSERT (col1, col2, col3) VALUES ( JT.col1 , JT.col2 , JT.col3 ); 여기서는 update, insert만 썼지만 delete도 얼마든지 가능하다.

[오라클] 테이블 복사 (Creat Table As Selcet)

이따금씩 테이블 복제가 필요한 경우가 있다. 보통 개발이나 테스트시에 임시로 백업이 필요한 경우에 종종쓴다 그럴때마다 crate 하고 insert를 별도로 할필요없이  한번에 할 수있다.  create table new_table as select * from org_table org_table을 new_table로 복사하는 sql이다.  Creat Table As Selcet 을 줄여서 CTAS라고도 많이 부르는것 같다.  만약에  해당 테이블의 스키마만 복사하고 싶을때는  where 조건을 추가해서 select구문의 결과값이 하나도 안나오게끔 해주면 된다.  create table new_table as select * from org_table where 1 = 0