перетворення int на real в sqlite - -


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
Ви насправді не повинні використовувати цей трюк, оскільки розробникам (включаючи вас самих) легко повернутися і видалити те, що виглядає як зайвий код. Найкращою практикою було б кидати плавати, як я запропонував нижче.
Адам Гарнер

1
Це хак. Найкращий, найбільш явний спосіб зробити це - використовувати CAST. Також існує ймовірність того, що це може зіпсуватись у певних сценаріях. Я бачив, що подібні речі не спрацьовують при створенні таблиці на основі запиту. Лиття значення виправило цю проблему.
Майк

57

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

Тому, якщо ви перекидаєте свій перечислювач на плаваючу лінію:

SELECT CAST(field1 AS FLOAT) / field2

1
Тож чи краще призначати int вручну, щоб плавати або помножувати на 1,0 (як відповів @NullUserException)?
Фелікс Едельманн

2
Так, з однієї простої причини. Ви чітко заявляєте про те, що маєте намір здійснити. І не вкладати щось, що покладається на те, що інші розробники знають, чому ви помножили на 1.
Адам Гарнер

4
@FelixEdelmann Крім того, якщо ви явно не робите плаваючу копію, ви самі можете навіть забути, чому у вас є ця 1.0, і в якийсь момент її видалити. Це стосується не лише інших розробників.
danuker

1
Щоб додати до цього, як я вже зазначив у прийнятій відповіді, у нас було поле, яке обчислювалось (законно) і використовувалось у СТВОРИТИ ТАБЛИЦЮ з SELECT, і значення поверталися як значення TEXT (можливо, було натиснуто NULL або щось інше ). Кастинг був єдиним, що нам це виправило.
Mike


3

або якщо ви хочете оновити стовпець на основі текстового стовпця:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.