Regex Postgresql 8.3中的正则表达式替换

Regex Postgresql 8.3中的正则表达式替换,regex,postgresql,null,plpgsql,Regex,Postgresql,Null,Plpgsql,这个问题涉及到博士后8.3 我有一根像 NULL + INTERVAL '3 days' > TIMESTAMPTZ '2012-01-01' - INTERVAL '1 month' >运算符(也可以是正则表达式)的两侧可以如下所示: SELECT regexp_replace(txt , 'NULL [+-] INTERVAL ''.*?''' , 'NULL' ,

这个问题涉及到博士后8.3

我有一根像

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

>运算符(也可以是正则表达式)的两侧可以如下所示:

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'

*?
*

的非贪婪版本,你知道
NULL+任何东西的计算结果都是
NULL
,因此如果你想在SQL中使用它,你不必更改字符串吗?请编辑你的问题来修复引号,因为现在它们看起来有点随机:-)。我想知道这是不是真的,由于此错误:
错误:运算符不存在:间隔>不带时区的时间戳第1行:选择NULL+interval'22天'>时间戳'2011-12-2…
。我将一个间隔添加到NULL,它无法将间隔与时间戳进行比较。嗯,我后来加上了“时间戳”,所以如果我没有时间戳,也许这就是为什么你的答案是正确的。无论如何,
NULL+INTERVAL'1 day'
与时间戳相比应该是NULL。@Leonard:Tim是绝对正确的,
NULL
与任何通用的结果结合在一起会导致
NULL
。不要将数据类型与值混淆。仅当定义了相关数据类型的运算符时,才能比较值。这在PostgreSQL中是不可能的:
SELECT NULL::interval>NULL::timestamp
@Erwin我将重点放在正则表达式解决方案上,因为由于昨天创建的函数(),我正在修改字符串。谢谢。我已经使用了
*
,但它太贪婪了。我们为什么要使用
?它满足了我的需要:)@Leonard:酷。我在我的答案中添加了信息和链接。谢谢,我不知道关于
*?
:)的内容。完成!
NULL + INTERVAL '3 days' > NULL - INTERVAL '1 month'
NULL > NULL
TIMESTAMPTZ '2012-01-01' + INTERVAL '3 days' > TIMESTAMPTZ '2012-02-01' - INTERVAL '1 month'
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'