1

在 postgresql 中,我试图为文本字段中的价格返回格式化的价格值,但仅当文本字段值不包含其他多余文本时。

例如,使用这三个文本值...

  • '提供超过 580,000 美元'

  • '499000'

  • “现在 419,000 美元 - 459,000 美元”

我想回来...

  • '提供超过 580,000 美元'

  • “499,000 美元”

  • “现在 419,000 美元 - 459,000 美元”

我一直在尝试使用正则表达式来提取我的值,然后转换为十进制,然后格式化输出以获得我想要的值。例如...

SELECT
CASE WHEN COALESCE(SUBSTRING(btrim('499000'::text) FROM '(^(\$?[0-9,]*)(\.[0-9]{2})?)$'),'') != '' 
THEN to_char(substring('499000' FROM '^((\$?[0-9,]*)(\.[0-9]{2})?)$')::decimal, 'FM$999,999,999'::text) 
ELSE '499000' 
END as testresult

当我将 '499000' 换成 'Offers over $580,000' 时,我收到一个错误,因为正则表达式仍在将其视为有效,然后尝试将其转换为十进制。但是我无法理解为什么第二个值通过正则表达式,因为我说字符串必须以选项美元符号 + 数字组合开头。我认为。

谁能指出我正确的方向?我看过许多其他正则表达式帖子,但没有一个可以帮助我回答这个问题(如果它包含解决方案,很高兴被指向另一个帖子)。

谢谢!

4

1 回答 1

0

这是一个您可能会觉得方便的正则表达式选项。它保留小数点,并使用 PostgreSQL 的本地货币格式:

with vals(val) as (values ('Offers over $580,000'::text), ('499000'), ('NOW $419,000 - WAS $459,000'), ('  $ -1.87857 '), (' - $1.87857 '))
select case when val ~ '^\s*(-?\s*\$?|\$?\s*-?)[0-9,]+\.[0-9]+\s*$' then val::money::text 
            when val ~ '^\s*(-?\s*\$?|\$?\s*-?)[0-9,]+\s*$' then left(val::money::text, -3)
            else val end
from vals
于 2016-06-27T07:05:51.037 回答