【发布时间】: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