提取价格文本时的 postgresql 正则表达式分组 + 转换问题

postgresql regex grouping + casting issues when extracting price text

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

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

我想return...

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

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, 'FM9,999,999'::text) 
ELSE '499000' 
END as testresult

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

任何人都可以指出我在这方面的正确方向吗?我见过许多其他正则表达式 post,但 none 可以帮助我回答这个问题(很高兴被指向另一个 post,如果它包含解决方案)。

谢谢!

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

with vals(val) as (values ('Offers over 0,000'::text), ('499000'), ('NOW 9,000 - WAS 9,000'), ('  $ -1.87857 '), (' - .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