【问题标题】:PostgreSQL convert varchar to numeric and get averagePostgreSQL 将 varchar 转换为数值并取平均值
【发布时间】:2017-07-18 18:38:37
【问题描述】:

我有一列要取平均值,该列是 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 列中?

标签: postgresql average


【解决方案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.]) 删除所有奇怪的字符,然后使用 globally:

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 here

上检查所有内容

【讨论】:

  • 好的,我如何从你的评论中得到平均值
  • 您将CAST(...) 更改为avg(CAST(...))。即,您使用 avg 聚合函数。
【解决方案2】:

我要冒昧地说,这可能是因为您的列中有空字符串而不是空值;这将导致您看到的错误。尝试将列名包装在 nullif 中:

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

但我真的会质疑您的架构,您将数值存储在 varchar 列中......

【讨论】:

    猜你喜欢
    • 2019-06-07
    • 2018-03-07
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多