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

Vij*_* DJ 111 postgresql casting

我从一个在Varchar中有原始feed的表中导入数据,我需要将varchar中的一列导入到一个字符串列中.我尝试使用<column_name>::integer以及to_number(<column_name>,'9999999')但是我收到错误,因为有一些空字段,我需要将它们检索为空或null到新表中.

如果有相同的功能,请告诉我.

Fra*_*ens 113

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

SELECT
    NULLIF(your_value, '')::int
Run Code Online (Sandbox Code Playgroud)


tat*_*tty 53

你甚至可以进一步限制这个合并的领域,例如: -

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


vye*_*rov 26

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

SELECT CAST(nullif(<column>, '') AS integer);
Run Code Online (Sandbox Code Playgroud)

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

SELECT CAST(coalesce(<column>, '0') AS integer);
Run Code Online (Sandbox Code Playgroud)

我同意,错误信息会有很大帮助.


Cha*_*mel 24

我成功没有因为NULL或特殊字符或空字符串而出错的唯一方法是这样做:

SELECT REGEXP_REPLACE(COALESCE(<column>, '0'), '[^0-9]*' ,'0')::integer FROM table
Run Code Online (Sandbox Code Playgroud)

  • 对我来说(9.6.2)这是唯一有效的,所有其他答案都失败了. (2认同)
  • 你能不能添加一个`WHERE <column>!= NULL`? (2认同)

nik*_*iko 12

在Lukas的帖子里,我无法发表评论(声誉太少?我很新).

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

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table
Run Code Online (Sandbox Code Playgroud)


小智 9

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

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

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


Abe*_*ejo 5

常见问题

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

SELECT ''::integer
Run Code Online (Sandbox Code Playgroud)

经常导致著名的错误:

Query failed: ERROR: invalid input syntax for integer: ""
Run Code Online (Sandbox Code Playgroud)

问题

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

解决方案

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

Query failed: ERROR: invalid input syntax for integer: ""
Run Code Online (Sandbox Code Playgroud)

用法

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;
Run Code Online (Sandbox Code Playgroud)