Regex Replace в Postgresql 8,3 - PullRequest
       3

Regex Replace в Postgresql 8,3

0 голосов
/ 18 января 2012

Этот вопрос касается Postgres 8.3.

У меня есть строка типа

NULL + INTERVAL '3 days' > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month'

Обе стороны оператора> (которые также могут быть <, = или <>) содержат метку времениили NULL, сопровождаемый + или - и указанием интервала.

Если временная метка равна NULL, я хочу избавиться от '+ INTERVAL' 3 days ''.Это должно быть возможно с регулярными выражениями, но я совершенно новичок в их использовании.Как мне это сделать?Несколько примеров того, что я хочу:

1)

NULL + INTERVAL '3 days' > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month'

следует изменить на

NULL > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month'

2)

NULL + INTERVAL '3 days' > NULL - INTERVAL '1 month'

изменить на

NULL > NULL

3)

TIMESTAMPTZ '2012-01-01' + INTERVAL '3 days' > TIMESTAMPTZ '2012-02-01' - INTERVAL '1 month'

следует оставить без изменений.

1 Ответ

2 голосов
/ 18 января 2012

Регулярное выражение может выглядеть следующим образом:

SELECT regexp_replace(txt
                    , 'NULL [+-] INTERVAL ''.*?'''
                    , 'NULL'
                    , 'g') AS txt
FROM (
   SELECT * FROM ( VALUES
    ('NULL + INTERVAL ''33 days'' > TIMESTAMPTZ ''2012-01-01'' - INTERVAL ''1 month''')
  , ('NULL + INTERVAL ''3 days'' > NULL - INTERVAL ''1 month''')
  , ('TIMESTAMPTZ ''2012-01-01'' + INTERVAL ''3 days'' > TIMESTAMPTZ ''2012-02-01'' - INTERVAL ''1 month''')
    ) x(txt)
) y

Возвращает:

                                   txt
----------------------------------------------------------------------------------
 NULL > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month'
 NULL > NULL
 TIMESTAMPTZ '2012-01-01' + INTERVAL '3 days' > TIMESTAMPTZ '2012-02-01' - INTERVAL '1 month'

Квантор *? - это не жадная версия *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...