5

私は基本的な postgres db を備えた Rails アプリを持っていますが、列の一部が文字列であり、それらが float であることが最善であることに気付きました。緯度と経度の列を varchar から浮動小数点に変換しようとしています。

この投稿Rails - gmaps4rails gem on postgresを試しましたが、このエラーが発生し続けましたERROR: invalid input syntax for type double precision: ""。私は他のことを試してみたいと思っています.postgresクエリでそれを行う方法の解決策を見てきましたが、それらを実装する方法がわかりません. これは簡単な問題です。「-73.88537758790638」 -73.88537758790638になりたい。実用的な解決策や、実装方法を理解している解決策が見つからないようです。

4

2 に答える 2

19

明らかな理由により、空の文字列を数値に変換することはできません。
あなたはそれを説明しなければなりません。NULLすべての出現箇所をまたは0または 互換性のあるものに置き換えます。

例の小数桁数については、データ型が必要numericであり、float ではなくreal( float4) もdouble precision( ) も必要ありませんfloat8。これらは不可逆型であり、十分に正確ではありません。見る:

自分で試してみてください:

SELECT '-73.88537758790638'::real             AS _float4
      ,'-73.88537758790638'::double precision AS _float8
      ,'-73.88537758790638'::numeric          AS _numeric;

結果 (Postgres 11 まで):

_float4  | _float8           | _numeric
---------+-------------------+-------------------
-73.8854 | -73.8853775879064 | -73.88537758790638

デシベル<>ここでフィドル

Postgres 12 で改善された表示 (extra_float_digitsデフォルトでより多く):

デシベル<>ここでフィドル

マニュアルの数値型。

解決

単一の SQL ステートメント (空の文字列を に置き換えますNULL):

ALTER TABLE tbl
ALTER COLUMN col1 TYPE numeric USING NULLIF(col1, '')::numeric;
于 2014-05-13T00:43:47.653 に答える
0

これは、ネイティブ ORM アプローチを使用して Rails で行うのは非常に簡単なことです。

change_column :restaurants, :column_name, ‘double precision USING CAST(column_name AS double precision)'
于 2016-07-07T23:00:10.680 に答える