преобразование int в реальное в sqlite

85

Деление в sqlite возвращает целочисленное значение

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

Можем ли мы привести результат к типу, чтобы получить реальное значение результата деления?

Vaichidrewar
источник

Ответы:

126

Просто умножьте одно из чисел на 1.0:

SELECT something*1.0/total FROM somewhere

Это даст вам деление с плавающей запятой вместо целочисленного деления.

NullUserException
источник
4
У меня это не работает с SQLite 3.15 .. Решение @AdamGarner работает.
Ma0
1
Вам действительно не следует использовать этот трюк, поскольку разработчикам (включая вас самих) легко вернуться и удалить то, что выглядит как избыточный код. Лучшей практикой было бы приведение в состояние плавания, как я предложил ниже.
Адам Гарнер
1
Это взлом. Лучший и наиболее явный способ сделать это - использовать CAST. Также существует вероятность того, что это может привести к ошибкам в определенных сценариях. Я видел, как подобные вещи терпят неудачу при создании таблицы на основе запроса. Приведение значения устранило эту проблему.
Майк,
57

В Sqlite деление целого числа на другое целое число всегда округляется до ближайшего целого числа.

Поэтому, если вы приведете свой перечислитель к float:

SELECT CAST(field1 AS FLOAT) / field2
Адам Гарнер
источник
1
Так что лучше привести int вручную к float или умножить на 1.0 (как ответил @NullUserException)?
Феликс Эдельманн,
2
Да по одной простой причине. Вы прямо говорите о том, что собираетесь произойти. И не использовать то, что полагается на других разработчиков, знающих, почему вы умножили на 1.
Адам Гарнер
4
@FelixEdelmann Кроме того, если вы явно не используете тип float, вы сами можете даже забыть, почему у вас стоит эта 1.0, и в какой-то момент удалить ее. Это касается не только других разработчиков.
danuker
1
Чтобы добавить к этому, как я сказал в принятом ответе, у нас было поле, которое вычислялось (законно) и использовалось в CREATE TABLE с помощью SELECT, и значения возвращались как значения TEXT (возможно, было достигнуто значение NULL или что-то еще ). Кастинг был единственным, что исправило это для нас.
Майк
3

или если вы хотите обновить столбец на основе текстового столбца:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
Грег
источник