将类型转换字符串转换为整数-Postgres


122

我正在从在Varchar中具有原始提要的表中导入数据,我需要将varchar中的列导入到字符串列中。我尝试使用<column_name>::integer和,to_number(<column_name>,'9999999')但是却遇到了错误,因为有一些空字段,我需要将它们作为空或null检索到新表中。

请让我知道是否有相同的功能。


5
您能告诉我们错误消息吗?这会有所帮助
Frank Heikens,2012年

Answers:


124

大胆猜测:如果您的值是一个空字符串,则可以使用NULLIF将其替换为NULL:

SELECT
    NULLIF(your_value, '')::int

55

您甚至可以进一步限制该合并字段,例如:

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10; 

27

如果需要将空列视为NULLs,请尝试以下操作:

SELECT CAST(nullif(<column>, '') AS integer);

另一方面,如果您确实有NULL需要避免的值,请尝试:

SELECT CAST(coalesce(<column>, '0') AS integer);

我同意,错误消息会有所帮助。


24

我成功没有因NULL,特殊字符或空字符串而出错的唯一方法是执行以下操作:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table

2
对我(9.6.2)而言,这是唯一有效的方法,其他所有答案均失败。
贾斯珀·德弗里斯

2
您不能添加一个WHERE <column> != NULL吗?
Matthieu

13

我无法在Lukas的帖子中发表评论(名声太低?我还很新)。

在我的PG上设置to_number(NULL)不起作用,所以我的解决方案是:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table

1
这应该可以,但是应该与不太冗长的NULLIF()方法完全等效。该标准实际上将NULLIF定义为CASE谓词的一种形式。
2012年

12

如果值包含非数字字符,则可以将值转换为整数,如下所示:

SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;

CASE运算符检查<column>,如果它与整数模式匹配,则将速率转换为整数,否则返回0



0

常见问题

像这样天真地将任何字符串转换为整数

SELECT ''::integer

通常会导致著名的错误:

Query failed: ERROR: invalid input syntax for integer: ""

问题

PostgreSQL没有预定义的函数来安全地将任何字符串类型转换为整数。

创建一个受PHP intval()函数启发的用户定义函数。

CREATE FUNCTION intval(character varying) RETURNS integer AS $$

SELECT
CASE
    WHEN length(btrim(regexp_replace($1, '[^0-9]', '','g')))>0 THEN btrim(regexp_replace($1, '[^0-9]', '','g'))::integer
    ELSE 0
END AS intval;

$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

用法

/* Example 1 */
SELECT intval('9000');
-- output: 9000

/* Example 2 */
SELECT intval('9gag');
-- output: 9

/* Example 3 */
SELECT intval('the quick brown fox jumps over the lazy dog');
-- output: 0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.