konwersja int na real w sqlite

85

Podział w sqlite zwracanej wartości całkowitej

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

Czy możemy zapisać wynik, aby otrzymać rzeczywistą wartość wyniku dzielenia?

vaichidrewar
źródło

Odpowiedzi:

126

Wystarczy pomnożyć jedną z liczb przez 1.0:

SELECT something*1.0/total FROM somewhere

To da ci dzielenie zmiennoprzecinkowe zamiast dzielenia liczb całkowitych.

NullUserException
źródło
4
To nie działa dla mnie z SQLite 3.15 .. Rozwiązanie autorstwa @AdamGarner działa.
Ma0
1
Naprawdę nie powinieneś używać tej sztuczki, ponieważ programistom (w tym tobie) łatwo jest wrócić i usunąć coś, co wygląda na nadmiarowy kod. Najlepszą praktyką byłoby rzucanie na float, jak zasugerowałem poniżej.
Adam Garner
1
To jest hack. Najlepszym, najbardziej wyraźnym sposobem na to jest użycie CAST. Istnieje również możliwość, że może to zepsuć się w określonych sytuacjach. Widziałem, że takie rzeczy zawodzą podczas tworzenia tabeli na podstawie zapytania. Rzutowanie wartości rozwiązało ten problem.
Mike,
57

W Sqlite dzielenie liczby całkowitej przez inną liczbę całkowitą zawsze będzie zaokrąglane w dół do najbliższej liczby całkowitej.

Dlatego jeśli rzucisz moduł wyliczający na zmiennoprzecinkowy:

SELECT CAST(field1 AS FLOAT) / field2
Adam Garner
źródło
1
Czy więc lepiej jest rzucić int ręcznie na float, czy pomnożyć przez 1.0 (jak odpowiedział @NullUserException)?
Felix Edelmann
2
Tak, z jednego prostego powodu. Mówisz wyraźnie o tym, co zamierzasz się wydarzyć. I nie wprowadzać czegoś, co zależy od innych programistów wiedzących, dlaczego pomnożyłeś przez 1.
Adam Garner
4
@FelixEdelmann Ponadto, jeśli nie rzucisz jawnie jako float, możesz nawet zapomnieć, dlaczego masz tę 1.0, i usunąć ją w pewnym momencie. Dotyczy to nie tylko innych programistów.
danuker
1
Aby dodać do tego, jak powiedziałem w zaakceptowanej odpowiedzi, mieliśmy pole, które było obliczane (zgodnie z prawem) i używane w CREATE TABLE z SELECT, a wartości wracały jako wartości TEXT (mogło trafiać w NULL lub coś w tym rodzaju ). Casting był jedyną rzeczą, która to naprawiła.
Mike
3

lub jeśli chcesz zaktualizować kolumnę na podstawie kolumny tekstowej:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
Greg
źródło