sqlite에서 int를 실수로 변환


84

sqlite의 나누기는 정수 값을 반환합니다.

sqlite> select totalUsers/totalBids from 
(select (select count(*) from Bids) as totalBids , 
(select count(*) from Users) as totalUsers) A;
1

나눗셈 결과의 실제 값을 얻기 위해 결과를 형변환 할 수 있습니까?

답변:


125

숫자 중 하나에 다음을 곱하면됩니다 1.0.

SELECT something*1.0/total FROM somewhere

정수 나눗셈 대신 부동 소수점 나눗셈을 제공합니다.


4
이것은 SQLite 3.15에서 작동하지 않습니다. @AdamGarner의 솔루션이 작동합니다.
Ma0

1
개발자 (자신 포함)가 다시 돌아와서 중복 코드처럼 보이는 것을 삭제하기 쉽기 때문에이 트릭을 사용해서는 안됩니다. 모범 사례는 아래에서 제안한대로 부동으로 캐스팅하는 것입니다.
Adam Garner

1
이것은 해킹입니다. 이를 수행하는 가장 좋은 방법은 CAST를 사용하는 것입니다. 특정 시나리오에서 이것이 망가질 가능성도 있습니다. 쿼리를 기반으로 테이블을 만들 때 이와 같은 작업이 실패하는 것을 보았습니다. 값을 캐스팅하면 그 문제가 해결되었습니다.
Mike

57

Sqlite에서 정수를 다른 정수로 나누면 항상 가장 가까운 정수로 내림됩니다.

따라서 열거자를 float로 캐스트하는 경우 :

SELECT CAST(field1 AS FLOAT) / field2

1
그래서 int를 수동으로 캐스트하여 부동하거나 1.0으로 곱하는 것이 더 낫습니까 (@NullUserException이 대답했듯이)?
Felix Edelmann

2
네, 간단한 이유가 있습니다. 당신은 당신이 일어날 의도에 대해 명시하고 있습니다. 그리고 당신은 1을 곱한 이유를 알고있는 다른 개발자에 의존 뭔가 참을 수 없어
아담 가너

4
@FelixEdelmann 또한 명시 적으로 float로 캐스트하지 않으면 1.0을 가지고있는 이유를 잊고 언젠가는 삭제할 수도 있습니다. 다른 개발자에게만 적용되는 것이 아닙니다.
danuker

1
여기에 추가하기 위해 수락 된 답변에서 언급했듯이 (합법적으로) 계산되고 SELECT가있는 CREATE TABLE에서 사용되는 필드가 있었고 값은 TEXT 값으로 돌아 왔습니다 (NULL 또는 무언가를 칠 수 있음) ). 캐스팅은 우리를 위해 그것을 고친 유일한 것입니다.
Mike


3

또는 텍스트 열을 기반으로 열을 업데이트하려는 경우 :

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.