PostgreSQL将varchar转换为数值并获得平均值

PostgreSQL将varchar转换为数值并获得平均值,postgresql,average,Postgresql,Average,我有一个列,我想得到一个平均值,这个列是varchar(200)。我一直在犯这个错误。如何将列转换为数值并获得其平均值 列中的值如下所示 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: 我要冒一个险说,这可能是因为列中有空字符串而不是

我有一个列,我想得到一个平均值,这个列是varchar(200)。我一直在犯这个错误。如何将列转换为数值并获得其平均值

列中的值如下所示

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:

我要冒一个险说,这可能是因为列中有空字符串而不是空字符串;这将导致您看到的错误。如果出现以下情况,请尝试将列名包装为空:

选择强制转换(合并(NULLIF(bonus)、、“0”)作为整数)作为新字段


但我真的会质疑你的模式,你在一个varchar列中存储了数值…

我会冒险说,这可能是因为你的列中有空字符串而不是空字符串;这将导致您看到的错误。如果出现以下情况,请尝试将列名包装为空:

选择强制转换(合并(NULLIF(bonus)、、“0”)作为整数)作为新字段


但是我真的很怀疑您的模式,您的数值存储在varchar列中…

在SQL中表示(作为文本)数值的标准方式如下:

16000.00
15000.00
16000.00
因此,文本中的“逗号”伤害了您

解决此问题最明智的方法是将数据存储为
数字
,而不是使用字符串(
文本
varchar
字符
)类型,正如所建议的那样

但是,假设这样做是有充分的理由的,例如您继承了一个无法更改的设计,一种可能性是在转换为数字之前去掉所有非a字符(减号、数字、句点):

假设这是您的输入数据

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) ;
您可以使用a和适当的正则表达式(
[^-0-9.]
)删除所有straneous字符,然后全局执行该操作:

SELECT
    CAST(
        COALESCE(
            NULLIF(
                regexp_replace(bonus, '[^-0-9.]+', '', 'g'), 
                ''),
            '0') 
       AS numeric)
FROM
    tableone ;
|结合| | -------: | | 16000.00 | | 15000.00 | | 16000.00 | | 25 | | 150 | | 0 | 看看15,0发生了什么(这可能不是您想要的)


检查dbfiddle上的所有内容

在SQL中表示(作为文本)数字的标准方法如下:

16000.00
15000.00
16000.00
因此,文本中的“逗号”伤害了您

解决此问题最明智的方法是将数据存储为
数字
,而不是使用字符串(
文本
varchar
字符
)类型,正如所建议的那样

但是,假设这样做是有充分的理由的,例如您继承了一个无法更改的设计,一种可能性是在转换为数字之前去掉所有非a字符(减号、数字、句点):

假设这是您的输入数据

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) ;
您可以使用a和适当的正则表达式(
[^-0-9.]
)删除所有straneous字符,然后全局执行该操作:

SELECT
    CAST(
        COALESCE(
            NULLIF(
                regexp_replace(bonus, '[^-0-9.]+', '', 'g'), 
                ''),
            '0') 
       AS numeric)
FROM
    tableone ;
|结合| | -------: | | 16000.00 | | 15000.00 | | 16000.00 | | 25 | | 150 | | 0 | 看看15,0发生了什么(这可能不是您想要的)


检查dbfiddle上的所有内容

你到底为什么要在
varchar
列中存储数字?你到底为什么要在
varchar
列中存储数字?好的,我如何从你的评论中获得平均值?你将
CAST(…)
更改为
avg(CAST(…)
。例如,您使用聚合函数。好的,我如何从您的评论中获得平均值您将
CAST(…)
更改为
avg(CAST(…)
。即,使用聚合函数。