2021-03-16 09:11:56

sqlite3에서 데이터 타입이 정수인 것을 정수로 나눠주면 결과도 정수로 나옵니다. 예를 들어 10/3이 소숫점 아래를 버리고 3으로 나옵니다. 그런데 소숫점 아래도 모두 제대로 나오게 하려면 어떻게 해야 할까요? 

 

우선 다음과 같은 내용이 담겨 있는 test라는 이름의 테이블이 있다고 가정하겠습니다. 

 

 

이 테이블의 구조를 살펴보면, money 열과 people 열 모두 INT 형의 데이터를 담을 수 있음을 알 수 있습니다. 참고로 sqlite에서 사용가능한 데이터타입에는 NULL, INT, REAL, TEXT, BLOB이 있는데, 이 중 INT와 REAL이 숫자 데이터를 위한 타입들입니다. INT는 정수, REAL은 실수.

 

 

이 상황에서 저는 첫번째 열의 값을 두번째 열의 값으로 나눠주고 싶습니다. 그러면, 한 명당 얼마의 돈을 배분받을 수 있는지 알 수 있습니다. 이를 위해, 저는 다음과 같은 쿼리문을 작성했습니다.

 

sqlite> SELECT money/people FROM test;

 

 

정수형 데이터들끼리 나눠주었더니 결과 역시 정수로 나왔습니다. 그런데 여기서 중요한 것은 실제 나눗셈의 결과는 정수가 아니라는 것입니다. 우리는 지금 소숫점 아래의 값들을 잃어버린 것입니다. 이 값들을 무시해도 괜찮은 상황도 있겠지만, 절대 무시하면 안 될 상황도 있을 것입니다. 만약 미사일 발사와 관련된 값들을 담는 테이블이였다면, 그 값의 상실로 사람의 목숨도 동시에 상실시킬 수 있습니다. 

 

이때 소숫점 아래의 결과도 제대로 나오게 하려면 약간의 트릭이 필요합니다. 2가지 정도의 방법이 있습니다. 

 

1. CAST 함수를 이용해서 형변환

첫번째 방법은 첫번째 열의 데이터타입을 CAST 함수를 이용해서 REAL, 즉 실수형으로 변환한 다음에 두번째 열로 나눠주는 것입니다. 

 

sqlite> SELECT CAST(money AS REAL)/people FROM test;

 

 

잃어버렸던 소숫점 아래의 값들을 되찾았습니다. 

 

2. 0.00을 더해줘서 형변환

두번째 방법은 분자에 0.00을 더해줘서 형변환을 시켜주는 것입니다. 정수값에 부동소숫점값을 더해줘서 데이터타입이 REAL이 되게 한 후에, 정수로 나눠주면 결과는 부동소숫점으로 나옵니다. 

 

sqlite> SELECT (money + 0.00)/people FROM test;