我正在从一个包含Varchar原始数据的表中导入数据,我需要将一个Varchar列导入到一个字符串类型的列中。我尝试使用<column_name>::integer
以及to_number(<column_name>,'9999999')
,但是我遇到了错误,因为有一些空字段,我需要将它们作为空或null值导入到新表中。
我正在从一个包含Varchar原始数据的表中导入数据,我需要将一个Varchar列导入到一个字符串类型的列中。我尝试使用<column_name>::integer
以及to_number(<column_name>,'9999999')
,但是我遇到了错误,因为有一些空字段,我需要将它们作为空或null值导入到新表中。
猜测:如果您的值为空字符串,您可以使用NULLIF将其替换为NULL:
SELECT
NULLIF(your_value, '')::int
你甚至可以进一步限制这个合并字段,例如:
SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10;
NULL
。需要转换为整数的是结果值(它是一个字符串),根据原始问题。 - Nic NilovNULL
,可以尝试这样做:SELECT CAST(nullif(<column>, '') AS integer);
另一方面,如果您确实有需要避免的NULL
值,请尝试:
SELECT CAST(coalesce(<column>, '0') AS integer);
我同意,错误信息会帮助很多。
我成功地避免了由于NULL、特殊字符或空字符串而导致的错误,唯一的方法就是这样做:
SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table
WHERE <column> != NULL
呢? - Matthieu我无法在Lukas的帖子中评论(声望太低了吗?我很新),
在我的PG设置中, to_number(NULL)
不起作用,所以我的解决方法是:
SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table
NULLIF()
方法的等价物。标准实际上将 NULLIF 定义为 CASE 谓词的一种形式。 - kgrittn如果值包含非数字字符,您可以按以下方式将该值转换为整数:
SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;
CASE运算符检查<column>,如果匹配整数模式,则将rate转换为整数,否则返回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
bigintval()
,并且对于该函数,将任何说integer
的地方替换为bigint
。失败可能只是由于数据类型限制造成的。 - Abel CallejoSUM(NULLIF(conversion_units, '')::numeric)
对我来说,完美的解决方案是使用nullif
和regexp_replace
SELECT NULLIF(REGEXP_REPLACE('98123162t3712t37', '[^0-9]', '', 'g'), '')::bigint;
上述解决方案考虑了以下边缘情况。
regexp_replace
函数能够完美地转换为整数。SELECT NULLIF(REGEXP_REPLACE('string and 12345', '[^0-9]', '', 'g'), '')::bigint;
SELECT NULLIF(REGEXP_REPLACE('only string', '[^0-9]', '', 'g'), '')::bigint;
bigint
代替。SELECT NULLIF(REGEXP_REPLACE('98123162t3712t37', '[^0-9]', '', 'g'), '')::bigint;
如果你的列有小数点
select NULLIF('105.0', '')::decimal
Query failed: ERROR: invalid input syntax for integer: ""
,请使用intval()函数来解决。 - Abel Callejo