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

时间:2017-07-18 18:38:38

标签: 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:

2 个答案:

答案 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 ,而不是使用字符串(numerictextvarchar)类型,正如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

中的所有内容