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