如何将postgres列类型从string转换为float

时间:2014-05-13 00:37:16

标签: ruby-on-rails postgresql activerecord database-normalization floating-point-conversion

我有一个带有基本postgres数据库的rails应用程序,但我意识到我的一些列是字符串,如果它们是浮点数最好。我正在尝试将纬度和经度的列从varchar转换为浮点。

我已尝试过这篇文章Rails - gmaps4rails gem on postgres,但我一直收到此错误ERROR: invalid input syntax for type double precision: ""。我愿意尝试其他任何东西,我已经看到了解决postgres查询的方法,但我不确定如何实现它们。这是一个直截了当的问题; “-73.88537758790638”我想成为-73.88537758790638。我似乎无法找到一个可行的解决方案或我理解如何实施的解决方案。

2 个答案:

答案 0 :(得分:8)

空字符串由于显而易见的原因无法转换为数字 你必须考虑到这一点。将所有匹配项替换为NULL0或兼容的内容。

同样,对于示例中的小数位数,您希望数据类型为numeric,而不是浮点数 - 既不是realfloat4)也不是double precision({{1 }})。那些是有损类型,到目前为止还不够准确。试着看看:

float8

结果:

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

Numeric types in the manual.

解决方案

单个SQL语句(用_float4 | _float8 | _numeric ---------+-------------------+------------------- -73.8854 | -73.8853775879064 | -73.88537758790638 替换空字符串):

NULL

答案 1 :(得分:0)

使用本机ORM方法在rails中执行此操作非常简单:

change_column :restaurants, :column_name, ‘double precision USING CAST(column_name AS double precision)'