sqliteでintをrealに変換する


84

sqliteの除算は整数値を返します

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

結果をタイプキャストして、除算結果の実際の値を取得できますか?

回答:


125

数値の1つに1.0:を掛けるだけです。

SELECT something*1.0/total FROM somewhere

これにより、整数除算ではなく浮動小数点除算が可能になります。


4
これはSQLite3.15では機能しません。@ AdamGarnerによるソリューションは機能します。
ma0 2018年

1
開発者(自分自身を含む)が戻ってきて冗長なコードのように見えるものを削除するのは簡単なので、このトリックを実際に使用するべきではありません。以下に提案するように、ベストプラクティスはフロートにキャストすることです。
アダムガーナー

1
これはハックです。これを行うための最良の、最も明示的な方法は、CASTを使用することです。これが特定のシナリオで台無しになる可能性もあります。クエリに基づいてテーブルを作成すると、このようなものが失敗するのを見てきました。値をキャストすると、その問題が修正されました。
マイク

57

Sqliteでは、整数を別の整数で除算すると、常に最も近い整数に切り捨てられます。

したがって、列挙子をフロートにキャストする場合:

SELECT CAST(field1 AS FLOAT) / field2

1
それで、intを手動でキャストしてfloatにするか、1.0で乗算する方が良いですか(@NullUserExceptionが答えたように)?
Felix Edelmann 2016年

2
はい、1つの単純な理由で。あなたは自分が何をしようとしているのかを明確にしています。そして、あなたは1を掛けてきた理由を知っている他の開発者に依存している何かを入れていない
アダム・ガーナー

4
@FelixEdelmannまた、明示的にfloatとしてキャストしないと、1.0を使用している理由を忘れて、ある時点で削除する可能性があります。他の開発者だけに適用されるわけではありません。
danuker 2017

1
これに加えて、受け入れられた回答で述べたように、(正当に)計算され、SELECTを使用してCREATE TABLEで使用されていたフィールドがあり、値はTEXT値として返されていました(NULLなどにヒットしている可能性があります) )。キャスティングは私たちのためにそれを修正した唯一のものでした。
マイク


3

または、テキスト列に基づいて列を更新する場合:

UPDATE table_with_fields SET real_field=cast(field_with_txt AS real)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.