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?

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.


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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.