Postgresql 8.3中的正则表达式替换

时间:2012-01-18 11:46:07

标签: regex postgresql null plpgsql

这个问题涉及Postgres 8.3。

我有一个像

这样的字符串
NULL + INTERVAL '3 days' > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month'

>的两侧运算符(也可以是<,=或<>)包含时间戳或NULL,后跟+或 - 以及间隔规范。

如果时间戳为NULL,我想摆脱'+ INTERVAL'3天''。它应该可以使用正则表达式,但我很擅长使用它们。我该怎么做?我想要的一些例子:

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 个答案:

答案 0 :(得分:2)

正则表达式可能如下所示:

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'

quantifier *?*的非贪婪版本。