2011-12-02 50 views
0

我试图让多个子句中的一个检查约束,由OR分隔:一个检查约束中的多个子句?

check (stop>start or stop = NULL) 

其中启动和停止都时间戳字段。因此,stop可以留空,但是如果指定了它,则必须晚于start

我完全错了吗?我在时间戳比较中没有发现任何内容,或者在检查约束中允许使用OR

这是在postgres 8.4.8。

回答

7

您应该使用stop IS NULL而不是stop = NULL

+0

啊谢谢,那工作 – Max

+1

你不应该使用'value = NULL',也不'value <> NULL',甚至不要'NULL = NULL'。他们永远不会评价为“真实”。 –

+0

他们都不会评价为“false”;-)他们评估为null。 –

4

这是允许的,但:

  • stop = NULL是没有意义的;你的意思是stop IS NULL
  • 不管怎样,无论如何都不需要指定OR stop IS NULL,因为检查约束只禁止某些内容为“false”,并且如果stop为空,则stop > start将为“null”(既不是“真”也不是“假”)。

有关检查约束的更多信息,请参阅http://www.postgresql.org/docs/8.4/interactive/ddl-constraints.html

应该注意的是,如果检查表达式计算结果为真或空值,则检查约束被满足。

+0

是的,但OP希望'stop'是'> start'或'NULL'。 –

+0

@ypercube:对不起,你一定误解了我写的东西?我的观点是'CHECK(stop> start)'等效于'CHECK(停止>开始或停止IS NULL)'。 – ruakh

+0

是的,你是对的,我的误解。 –