2017-07-18 169 views
0

我有一列,我想获得平均值,列是varchar(200)。我不断收到这个错误。如何将列转换为数字并获得平均值。PostgreSQL将varchar转换为数字并得到平均值

值列看起来像

16,000.00 
15,000.00 
16,000.00 etc 

当我执行

select CAST((COALESCE(bonus,'0')) AS numeric) 
from tableone 

...我得到

ERROR: invalid input syntax for type numeric: 
+5

究竟为什么你存储号码在'varchar'列? –

回答

1

标准的方式来表示(如文本)在SQL中的数字是一样的东西:

16000.00 
15000.00 
16000.00 

所以,你逗号在文中伤害你。

解决这一问题将是存储数据只是作为一个numeric,而不是使用字符串(textvarcharcharacter)型的,如已被a_horse_with_no_name提出的最明智的方式。

然而,假设这是一个很好的理由做了,比如你继承了设计,你无法改变的,一种可能性是摆脱所有这一切都不是(减号,数字周期)之前的字符铸造数字:

让我们假设这是你的输入数据

CREATE TABLE tableone 
(
    bonus text 
) ; 

INSERT INTO tableone(bonus) 
VALUES 
    ('16,000.00'), 
    ('15,000.00'), 
    ('16,000.00'), 
    ('something strange 25'), 
    ('why do you actually use a "text" column if you could just define it as numeric(15,0)?'), 
    (NULL) ; 

您可以删除所有与regexp_replace和适当的正则表达式([^-0-9.])的straneous字符,并做到这一点g lobally:

SELECT 
    CAST(
     COALESCE(
      NULLIF(
       regexp_replace(bonus, '[^-0-9.]+', '', 'g'), 
       ''), 
      '0') 
     AS numeric) 
FROM 
    tableone ; 
 
| coalesce | 
| -------: | 
| 16000.00 | 
| 15000.00 | 
| 16000.00 | 
|  25 | 
|  150 | 
|  0 | 

看看会发生什么的15,0(这可能不是你想要的)。

检查一切在dbfiddle here

+0

确定如何从您的评论中获得平均值 – user747291

+0

您将'CAST(...)'更改为'avg(CAST(...))'。即,您使用['avg'](https://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE)聚合函数。 – joanolo

+0

谢谢,帮助... – user747291

1

我要出去肢体和说这可能是因为你的列中有空字符串而不是空值;这会导致你看到的错误。尝试在NULLIF包装列名:

SELECT CAST(coalesce(NULLIF(bonus, ''), '0') AS integer) as new_field

但我真的怀疑你的模式,你必须存储在VARCHAR列数值...