我有一个我希望获得平均值的列,该列是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:
答案 0 :(得分:1)
我要走出去,说这可能是因为你的列中有空字符串而不是空字符串;这会导致你看到的错误。尝试将列名称包装在nullif:
中 SELECT CAST(coalesce(NULLIF(bonus, ''), '0') AS integer) as new_field
但是我真的会质疑你的架构是否有数值存储在varchar列中......
答案 1 :(得分:1)
在SQL中表示(作为文本)数字的标准方法如下:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="box">Hello World</div>
<div id="click">
click me
</div>
因此,文中的逗号会伤害到你。
解决此问题最明智的方法是将数据存储为16000.00
15000.00
16000.00
,而不是使用字符串(numeric
,text
,varchar
)类型,正如a_horse_with_no_name已经提出的那样。
然而,假设这样做是有充分理由的,例如你继承了一个你无法改变的设计,一种可能性是摆脱所有不是(减号,数字,句号)的字符转换为数字:
我们假设这是您的输入数据
character
您可以使用regexp_replace
和正确的正则表达式(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) ;
)删除所有乱序字符,并以[^-0-9.]
形式执行:
g
| coalesce | | -------: | | 16000.00 | | 15000.00 | | 16000.00 | | 25 | | 150 | | 0 |
看看15,0会发生什么(这可能不是你想要的)。
检查 dbfiddle here
中的所有内容