PostgreSQL:如何将带有浮点数的字符串转换为整数?

3

我有一个奇怪的问题。有些表中有整数列,我想插入带有数字的字符串值。对于像110等值的字符串,这很有效,但对于带有小数点的值,如3.14,则失败。

这样的SQL看起来像:

INSERT INTO test (intcol) VALUES ('2');
INSERT INTO test (intcol) VALUES ('1.7');

并且失败了:

ERROR: invalid input syntax for integer: "1.7"

我尝试在 Oracle 和 Informix 中使用了这段代码,两者都能正常运行,但结果不同。Oracle 会四舍五入并插入2,而 Informix 则是截断并插入1。

我知道在 PostgreSQL 中可以使用以下语句:

INSERT INTO test (intcol) VALUES (1.7);

然后PostgreSQL会将其四舍五入并插入2,但我想知道是否可以对字符串做类似的操作。


至于为什么这样做?我可以回答这是更大应用程序的一部分,其中使用PreparedStatement,其中所有参数都是字符串。该应用程序不检查数据库模式以使用特定类型的变量用于每个列,它只是使用字符串,在现实中,此PreparedStatement看起来像:

InsertSQL("INSERT INTO " + table_name + " (" + columns + ") VALUES (" + question_marks + ")", csv_data);

为什么你要尝试将字符串字面量插入到一个整数列中呢? - jarlh
但是在应用程序中将字符串转换为数字不是更好吗?在我看来,如果需要将字符串转换为数字,将字符串插入表中并让PostgreSQL完成转换工作并没有太多意义。此外,在应用程序中,您可以更好地控制这些字符串。 - Alberto Solano
2个回答

7
使用cast('1.7' as double precision),然后尝试插入它。
INSERT INTO test (intcol) VALUES (cast('1.7' as double precision));

谢谢。我希望能够在不改变SQL的情况下,通过添加/更改数据库函数将字符串转换为整数。我认为其他我了解的数据库使用NUMERIC类型,因此它们将字符串转换为数字,然后再将数字转换为整数。 - Michał Niklas

2
如果您真的没有直接插入整数的选择,您可以使用以下方式使用round函数:round。请注意保留HTML标签。
InsertSQL("INSERT INTO " + table_name + " (" + columns + ") VALUES (round(" + question_marks + "))", csv_data);

谢谢。请看我对PatNowak解决方案的评论。我更喜欢使用round()函数,而强制转换可以像round()一样工作,或者简单地截断(类似于floor())。 - Michał Niklas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接