【问题标题】:Regex Replace in Postgresql 8.3Postgresql 8.3 中的正则表达式替换
【发布时间】:2012-01-19 17:50:35
【问题描述】:

这个问题涉及 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'

应该保持不变。

【问题讨论】:

  • 您知道NULL + anything 的计算结果为NULL,因此如果您想在SQL 中使用它就不必更改字符串?还请编辑您的问题以修复引号,因为它们看起来有点随机:-)。
  • 我想知道这是不是真的,因为这个错误:ERROR: operator does not exist: interval > timestamp without time zone LINE 1: SELECT NULL + INTERVAL '22 days' > TIMESTAMP '2011-12-2...。我向 NULL 添加了一个间隔,它无法将间隔与时间戳进行比较。好吧,我后来添加了“时间戳”,所以如果我没有 TIMESTAMP,也许这就是为什么你的答案是正确的。无论如何,NULL + INTERVAL '1 day' 与时间戳相比应该为 NULL。
  • @Leonard:Tim 是绝对正确的,NULL 结合 anything 普遍会产生NULL。不要将数据类型与值混淆。如果为所涉及的数据类型定义了运算符,则只能比较值。这在 PostgreSQL 中是不可能的:SELECT NULL::interval > NULL::timestamp.
  • @Erwin 我专注于正则表达式解决方案,因为由于我们昨天创建的函数(stackoverflow.com/questions/8893153/…),无论如何我都在修改字符串。

标签: regex postgresql null plpgsql


【解决方案1】:

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

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*? 是 * 的非贪婪版本。

【讨论】:

  • 谢谢。我已经用过.*,但是太贪心了。为什么要使用??它可以满足我的需要:)。
  • @Leonard:酷。我在答案中添加了信息和链接。
  • 谢谢,我不知道*? :)。完成!
猜你喜欢
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 2019-01-24
  • 2011-07-13
  • 2015-01-24
相关资源
最近更新 更多