2011-12-02 45 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

是的,你是對的,我的誤解。 –