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

时间:2012-05-09 14:34:34

标签: postgresql casting

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

请告诉我是否有相同的功能。

10 个答案:

答案 0 :(得分:109)

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

SELECT
    NULLIF(your_value, '')::int

答案 1 :(得分:51)

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

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

答案 2 :(得分:25)

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

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

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

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

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

答案 3 :(得分:21)

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

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

答案 4 :(得分:11)

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

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

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

答案 5 :(得分:8)

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

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

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

答案 6 :(得分:3)

常见问题

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

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

答案 7 :(得分:2)

您可以使用此查询

SUM(NULLIF(conversion_units, '')::numeric)

答案 8 :(得分:0)

如果你的列有小数点

select NULLIF('105.0', '')::decimal

答案 9 :(得分:-1)

我将两分钱转换为整数的美分:

SELECT REGEXP_REPLACE('0' || "<column>", '[[:alpha:]]', '', 'g')::int

基于https://www.postgresqltutorial.com/regexp_replace/