145

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

4

10 回答 10

151

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

SELECT
    NULLIF(your_value, '')::int
于 2012-05-09T14:43:39.550 回答
60

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

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10; 
于 2012-12-01T13:38:19.930 回答
30

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

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

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

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

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

于 2012-05-09T14:44:01.107 回答
29

由于 NULL、特殊字符或空字符串,我成功地没有错误的唯一方法是这样做:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table
于 2015-06-01T20:22:41.467 回答
15

我无法对 Lukas 的帖子发表评论(声誉太低?我是新手)。

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

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table
于 2012-05-09T14:46:32.417 回答
13

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

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

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

于 2018-06-22T08:59:53.990 回答
6

常见问题

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

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
于 2020-03-02T08:40:23.670 回答
3

你可以使用这个查询

SUM(NULLIF(conversion_units, '')::numeric)
于 2020-01-10T12:21:27.717 回答
0

如果您的列有小数点

select NULLIF('105.0', '')::decimal
于 2021-04-14T06:53:52.500 回答
0

这对我有用:

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
于 2022-02-18T00:44:18.330 回答