PostgreSQL 8.4
我有以下的sql-script:
WHERE p.partner_id IS NOT NULL
AND (let.external_transaction_registration_date IS NULL OR
let.external_transaction_registration_date > :date)
检查not-null或null是否正确的方法是否应该应用constratints?即使E2
为真,postgresql也会评估(E1 OR E2)
中的排名E1
吗?
答案 0 :(得分:3)
postgresql是否评估
E2
中的排名(E1 OR E2)
(即使E1
为真)?
也许。根据{{3}}:
,这是不可预测的未定义子表达式的评估顺序。特别是,操作员或功能的输入不一定是从左到右或以任何其他固定顺序进行评估。
此外,如果可以通过仅评估表达式的某些部分来确定表达式的结果,则可能根本不会评估其他子表达式。
但是你的表达是安全的,spec:
SQL使用带有true,false和null的三值逻辑系统,表示“未知”。
如果值为NULL
,评估结果为(TRUE OR NULL)
,即TRUE
。
实际上这两个表达式都满足了你的需求(要么不为null,要么为null,那么就不应该使用constratints ):
WHERE date_col IS NULL OR date_col > :date
-- vs:
WHERE date_col > :date OR date_col IS NULL
这些子句中的布尔表达式(
AND
/OR
/NOT
组合)可以用布尔代数定律允许的任何方式重新组织。