5

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

我已经在 postgres 上尝试过这篇文章 Rails - gmaps4rails gem,但我一直收到这个错误,ERROR: invalid input syntax for type double precision: "". 我愿意尝试其他任何事情,并且我已经看到了使用 postgres 查询的方法的解决方案,但我不确定如何实现它们。这是一个简单的问题;“-73.88537758790638”我想变成-73.88537758790638。我似乎找不到可行的解决方案或我了解如何实施的解决方案。

4

2 回答 2

19

由于显而易见的原因,空字符串不能转换为数字。
你必须考虑到这一点。NULL用或0或兼容的东西替换所有出现的地方。

对于示例中的小数位数,您需要数据类型numeric,而不是浮点数 - 既不是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

db<>在这里摆弄

Postgres 12 中的显示改进(extra_float_digits默认更多):

db<>在这里摆弄

手册中的数字类型。

解决方案

单个 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 回答