将字符串类型化为整数

我从一个在 Varchar 有原始提要的表中导入数据,我需要将 Varchar 中的一列导入到一个字符串列中。我尝试使用 <column_name>::integerto_number(<column_name>,'9999999'),但我得到了错误,因为有一些空字段,我需要检索到新表为空或空。

420083 次浏览

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

SELECT
NULLIF(your_value, '')::int

如果需要将空列视为 NULL,请尝试这样做:

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

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

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

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

我不能对卢卡斯的帖子发表评论(名气太小? 我是新人)。

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

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

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

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

唯一不会因为 NULL、特殊字符或空字符串而出现错误的方法是这样做:

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

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

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

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

您可以使用此查询

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

常见问题

天真地输入将任何字符串转换为整数,如下所示

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

如果你的列有小数点

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

这对我有用:

select (left(regexp_replace(coalesce('<column_name>', '0') || '', '[^0-9]', '', 'g'), 8) || '0')::integer

观看方便:

select (
left(
regexp_replace(
-- if null then '0', and convert to string for regexp
coalesce('<column_name>', '0') || '',
'[^0-9]',
'',
'g'
),      -- remove everything except numbers
8       -- ensure ::integer doesn't overload
) || '0'    -- ensure not empty string gets to ::integer
)::integer