2015-01-13 21 views
1

PostgreSQL 8.4在sql中檢查不爲空?

我有以下的一段SQL腳本的:

WHERE p.partner_id IS NOT NULL 
    AND (let.external_transaction_registration_date IS NULL OR 
let.external_transaction_registration_date > :date) 

它是正確的方法來檢查或者不空,或者爲空則是沒有constratints應適用?即使E1爲真,postgresql是否會在(E1 OR E2)中評估一個排除E2

+1

在這種特殊情況下,爲什麼測試E2有任何用處?如果E1成功,那麼該值顯然爲空,並且不可能等於/大於/小於其他任何值,包括其自身 –

+0

@MarcB也許,但我只想知道postgresql如何評估'(E1或E2 )'。如果E1是真的,它會評估E2嗎? –

+0

@MarcB:你看到'OR'了嗎?如果那些與'AND'結合使用'x是null或x> something'的條件確實有意義,那麼您的評論就有意義了。 –

回答

3

PostgreSQL可以evalute的exression E2(E1 OR E2)(即使E1是真實的)?

也許吧。根據spec不可預知:

子表達式的評估順序未定義。特別是,操作員或功能的輸入不一定是從左到右或以任何其他固定順序進行評估。此外,如果一個表達式的結果只能通過評估它的某些部分來確定,那麼其他的子表達式可能根本就不會被評估。

但是你的表情是安全的,because

SQL使用三值邏輯系統,真,假,和null,表示 「未知」。

NULL值的情況下,評價都按(TRUE OR NULL),這是TRUE

事實上這兩種表述都滿足您的需求(要麼不空,或者爲空則是沒有constratints應適用):

WHERE date_col IS NULL OR date_col > :date 
-- vs: 
WHERE date_col > :date OR date_col IS NULL 

布爾表達式(AND/OR/NOT組合)可以按照布爾代數法則允許的任何方式進行重組。

這也是appliesPostgreSQL 8.4