Konvertieren von int in real in SQLite

80

Division in sqlite gibt einen ganzzahligen Wert zurück

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

Können wir das Ergebnis typisieren, um den tatsächlichen Wert des Divisionsergebnisses zu erhalten?

Vaichidrewar
quelle

Antworten:

122

Multiplizieren Sie einfach eine der Zahlen mit 1.0:

SELECT something*1.0/total FROM somewhere

Dadurch erhalten Sie eine Gleitkommadivision anstelle einer Ganzzahldivision.

NullUserException
quelle
4
Dies funktioniert bei SQLite 3.15 nicht. Die Lösung von @AdamGarner funktioniert.
Ma0
1
Sie sollten diesen Trick wirklich nicht anwenden, da es für Entwickler (einschließlich Sie selbst) einfach ist, zurück zu kommen und etwas zu löschen, das wie redundanter Code aussieht. Die beste Vorgehensweise wäre, zu schweben, wie ich unten vorgeschlagen habe.
Adam Garner
1
Das ist ein Hack. Der beste und expliziteste Weg, dies zu tun, ist die Verwendung von CAST. Es besteht auch die Möglichkeit, dass dies in bestimmten Szenarien schief geht. Ich habe gesehen, dass solche Dinge fehlgeschlagen sind, wenn eine Tabelle basierend auf einer Abfrage erstellt wurde. Das Casting des Werts hat dieses Problem behoben.
Mike
55

In Sqlite wird die Division einer Ganzzahl durch eine andere Ganzzahl immer auf die nächste Ganzzahl abgerundet.

Wenn Sie also Ihren Enumerator in einen Float umwandeln:

SELECT CAST(field1 AS FLOAT) / field2
Adam Garner
quelle
1
Ist es also besser, das int manuell in float umzuwandeln oder mit 1.0 zu multiplizieren (wie @NullUserException antwortete)?
Felix Edelmann
2
Ja, aus einem einfachen Grund. Sie geben explizit an, was Sie vorhaben. Und nicht etwas einfügen, das darauf beruht, dass andere Entwickler wissen, warum Sie mit 1 multipliziert haben.
Adam Garner
4
@FelixEdelmann Wenn Sie nicht explizit als float umwandeln, vergessen Sie möglicherweise selbst, warum Sie diese 1.0 haben, und löschen sie irgendwann. Dies gilt nicht nur für andere Entwickler.
Danuker
1
Um dies hinzuzufügen, hatten wir, wie ich in der akzeptierten Antwort angegeben habe, ein Feld, das (legitim) berechnet und in einer CREATE TABLE mit SELECT verwendet wurde, und die Werte wurden als TEXT-Werte zurückgegeben (möglicherweise wurde NULL oder so getroffen ). Casting war das einzige, was es für uns behoben hat.
Mike
3

oder wenn Sie die Spalte basierend auf der Textspalte aktualisieren möchten:

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