如何从价格列中删除货币符号?

时间:2015-02-17 06:39:16

标签: sql postgresql amazon-redshift

我有一个价格列,它是字符串,并且有来自世界各地的产品的价格,现在当我尝试执行任何操作,如总和我收到错误。 所以我的问题是如何从所有国家/地区的价格列中删除货币符号?

以下是我的示例输入: -

locale   price 
cs_CZ   2462475,38 K
da_DK   kr 591.872,50
de_AT    267,70
de_CH   CHF 1'998.99
de_DE   1.798,09 
en_AE   AED7,236.20
en_AU   $1,699.00 
en_BD   Tk999,999.00
en_HK   HK$6,188.00
en_HU   Ft344,524,655.48
tr_TR   2.344.697,66 TL

2 个答案:

答案 0 :(得分:0)

您似乎同时拥有小数点和十进制逗号,但总是两位小数(希望其余的数据也是如此)。

  1. 您可以先将这些值放入值列表进行测试(在需要时添加额外的单引号)。
  2. 然后你必须用正则表达式修剪空格和字母。在内部SELECT中,您将获得带有单引号和逗号的子字符串,其中仍有数千个分隔符。
  3. 在外部SELECT中,您将替换小数侧的小数点逗号,并在整数侧删除千位分隔符。结果转换为数字类型,您可以使用它来计算总和等。

    SELECT (
        regexp_replace(left(substring, length(substring) -3),'[.,'']','','g')
            || replace(right(substring, 3),',','.'))::numeric,
        *
        FROM (
            SELECT substring(column1 from '(([0-9]+[,.''])*[0-9]+[.,][0-9]{2})[^0-9]*$'),
            column1
            FROM (
                VALUES ('2462475,38 K'),
                    ('kr 591.872,50'),
                    ('267,70'),
                    ('CHF 1''998.99'),
                    ('1.798,09'),
                    ('AED7,236.20'),
                    ('$1,699.00'),
                    ('Tk999,999.00'),
                    ('HK$6,188.00'),
                    ('Ft344,524,655.48'),
                    ('2.344.697,66 TL')
            ) currencies
        ) sq1;
    
  4. 以下是与9.0版PostgreSQL兼容的完整答案(未使用左()或右()函数)。此外,值列表将替换为SELECT查询,您可以使用自己的表和列替换该查询。最后,它全部被包含在SELECT查询中,该查询演示了sum-function的使用。

    SELECT sum(numeric) FROM (
        SELECT (
            regexp_replace(substr(substring, 0, length(substring) -3),'[.,'']','','g')
                || replace(substr(substring, length(substring) -3, length(substring)),',','.'))::numeric,
            *
            FROM (
                SELECT substring(column1 from '(([0-9]+[,.''])*[0-9]+[.,][0-9]{2})[^0-9]*$'),
                    column1
                    FROM (
                        SELECT column1 FROM your_table
                    ) currencies
            ) sq1
        ) sq2
    

答案 1 :(得分:0)

Postgres将大多数语言环境处理卸载到操作系统。因此,如果操作系统了解区域设置名称,并且您的价格字符串与其预期格式匹配,Postgres货币转换例程将仅适用于您。

例如,Windows不会接受da_DK作为区域设置,即使它确实如此,它也不接受字符串kr 591.872,50,因为它希望丹麦货币符号为{ {1}}代替kr.

那就是说,我认为这应该在基于Linux的服务器上运行得相当好:

kr