2016-06-27 2 views
1

В postgresql я пытаюсь вернуть форматированное значение цены за цену в текстовом поле, но ТОЛЬКО, когда значение текстового поля не содержит другого лишнего текста.postgresql regex grouping + вопросы литья при извлечении ценового текста

Например, с этими тремя текстовыми значениями ...

  • 'предлагает более $ 580000'

  • '499000'

  • 'NOW $ 419000 - WAS $ 459000'

Я хотел бы вернуться ...

  • 'предлагает более $ 580000'

  • '$ 499000'

  • 'NOW $ 419000 - WAS $ 459000'

Я пытаюсь использовать регулярное выражение для извлечения моего значения и затем кастинг до десятичного и затем форматирование вывода, чтобы получить значение, которое я хочу. Например ...

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» для «предлагает более $ 580000» Я получаю сообщение об ошибке, потому что регулярное выражение по-прежнему собирание это вверх как действительные, а затем пытается преобразовать его в десятичную. Однако мне трудно понять, почему это второе значение передаёт регулярное выражение, потому что я говорю, что строка должна начинаться с опции dollar-sign + number combo. Я думаю.

Может ли кто-нибудь указать мне в правильном направлении на этом? Я видел множество других сообщений регулярных выражений, но ни один из них не помог мне ответить на этот вопрос (с удовольствием указывал на другой пост, если он содержит решение).

Спасибо!

ответ

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 
+0

Отлично! Это работает! Благодаря! – user1399906

Смежные вопросы