convertir int a real en sqlite

84

División en sqlite devuelve valor entero

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

¿Podemos encasillar el resultado para obtener el valor real del resultado de la división?

vaichidrewar
fuente

Respuestas:

125

Simplemente multiplica uno de los números por 1.0:

SELECT something*1.0/total FROM somewhere

Eso le dará una división de punto flotante en lugar de una división entera.

NullUserException
fuente
4
Esto no me funciona con SQLite 3.15 .. La solución de @AdamGarner sí.
Ma0
1
Realmente no debería usar este truco, ya que es fácil para los desarrolladores (incluido usted mismo) regresar y eliminar lo que parece un código redundante. La mejor práctica sería lanzar para flotar como he sugerido a continuación.
Adam Garner
1
Este es un truco. La mejor y más explícita forma de hacer esto es usar CAST. También existe la posibilidad de que esto pueda arruinarse en escenarios específicos. He visto cosas como esta fallar al crear una tabla basada en una consulta. Lanzar el valor solucionó ese problema.
Mike
57

En Sqlite, la división de un número entero por otro entero siempre se redondeará al número entero más cercano.

Por lo tanto, si lanza su enumerador a un flotante:

SELECT CAST(field1 AS FLOAT) / field2
Adam Garner
fuente
1
Entonces, ¿es mejor lanzar el int manualmente para flotar o multiplicar con 1.0 (como respondió @NullUserException)?
Felix Edelmann
2
Sí, por una sencilla razón. Estás siendo explícito sobre lo que pretendes que suceda. Y no poner algo que dependa de que otros desarrolladores sepan por qué lo has multiplicado por 1.
Adam Garner
4
@FelixEdelmann Además, si no lanza explícitamente como flotante, usted mismo podría incluso olvidar por qué tiene ese 1.0 y eliminarlo, en algún momento. No solo se aplica a otros desarrolladores.
danuker
1
Para agregar a esto, como dije en la respuesta aceptada, teníamos un campo que se estaba calculando (legítimamente) y se usaba en CREATE TABLE con SELECT y los valores regresaban como valores de TEXT (podría haber estado presionando un NULL o algo así ). El casting fue lo único que nos solucionó.
Mike
3

o si desea actualizar la columna según la columna de texto:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
Greg
fuente