1

postgresql で、テキスト フィールドの価格に対して書式設定された価格値を返そうとしていますが、テキスト フィールド値に他の余分なテキストが含まれていない場合のみです。

たとえば、次の 3 つのテキスト値では...

  • 「580,000ドル以上のオファー」

  • 「499000」

  • 「現在 419,000 ドル - 以前は 459,000 ドル」

私は戻りたいと思います...

  • 「580,000ドル以上のオファー」

  • 「499,000ドル」

  • 「現在 419,000 ドル - 以前は 459,000 ドル」

正規表現を使用して値を抽出し、10 進数にキャストしてから、出力をフォーマットして必要な値を取得しようとしています。例えば...

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' に置き換えると、エラーが発生します。これは、正規表現がまだこれを有効なものとして選択し、10 進数に変換しようとしているためです。ただし、文字列はオプションのドル記号 + 数字の組み合わせで始まる必要があると言っているため、この 2 番目の値が正規表現を通過する理由を理解するのに苦労しています。おもう。

誰かがこれについて正しい方向に私を向けることができますか? 他の多くの正規表現の投稿を見てきましたが、この質問に答えるのに役立つものはありません (解決策が含まれている場合は、別の投稿を参照してください)。

ありがとう!

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 に答える