【问题标题】:PostgreSQL convert a string with commas into an integerPostgreSQL 将带逗号的字符串转换为整数
【发布时间】:2013-09-18 21:49:28
【问题描述】:

我想将具有逗号整数的“字符变化”类型的列转换为常规整数列。

我想支持从“1”到“10,000,000”的数字。

我尝试使用:to_number(fieldname, '999G999G999'),但它只有在格式与字符串的确切长度匹配时才有效。

有没有办法做到这一点,支持从 '1' 到 '10,000,000'?

【问题讨论】:

标签: postgresql


【解决方案1】:
select replace(fieldname,',','')::numeric ;

按照您最初尝试的方式进行操作,不建议这样做:

select to_number( fieldname,
                  regexp_replace( replace(fieldname,',','G') , '[0-9]' ,'9','g')
                );

内部替换将逗号更改为G。外部替换将数字更改为9。这不考虑小数或负数。

【讨论】:

  • 替换逗号很聪明,很容易,而且可能比使用 to_number() 快很多。谢谢。
  • 有一种使用 to_number 的方法(如果你有兴趣的话)。请看我的回答
【解决方案2】:

你可以用REPLACE()函数去掉逗号:

CREATE TABLE Foo
(
  Test NUMERIC
);

insert into Foo VALUES (REPLACE('1,234,567', ',', '')::numeric);

select * from Foo; -- Will show 1234567

【讨论】:

    【解决方案3】:

    您可以按照建议将逗号替换为空字符串,也可以将 to_number 与 FM prefix 一起使用,因此查询将如下所示:

    SELECT to_number(my_column, 'FM99G999G999')
    

    【讨论】:

    • select to_number('1,000,000,065','FM99G999G999'); 导致1000001,000,000,00010,000,000 也是如此)。 FM 是填充模式;仅抑制填充空白和尾随0s
    • @vol7ron 如果您使用格式来接受更大的数字,它仍然有效,例如'FM999G999G999G999G999'。尽管如此,to_number 看起来还是有点问题,因为它不适用于 '9G999G999G999'
    • 是的,检查 here ,它有足够的占位符但删除了最后一位(奇数)
    • 这是 9.6 中的相同示例,似乎问题仍然存在 (sqlfiddle.com/#!17/538b7/1) 我从未提交过错误报告
    【解决方案4】:

    有几点需要注意:

    在表上使用REPLACE("fieldName", ',', '')函数时,如果有VIEW使用该表,该函数将无法正常工作。您必须删除视图才能使用它。

    【讨论】:

    • 这很重要,但它应该是对其他答案之一的评论。就其本身而言,这并不能独立回答问题,而是似乎参考了以前的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2017-11-07
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多