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)
它是检查非null还是如果为null的正确方法,那么就不应该使用任何约束吗?PostgreSQL可以evalute的exressionE2
在(E1 OR E2)
即使E1
是真的吗?
PostgreSQL可以evalute的exression
E2
中(E1 OR E2)
(即使E1
是真实的)?
可能是。每个规范都是不可预测的:
没有定义子表达式的评估顺序。特别是,运算符或函数的输入不必从左到右或以任何其他固定顺序进行求值。
此外,如果只能通过评估表达式的某些部分来确定表达式的结果,则可能根本不会评估其他子表达式。
但是您的表达是安全的,因为:
SQL使用具有true,false和null的三值逻辑系统,该系统表示“未知”。
如果是NULL
值,则评估为(TRUE OR NULL)
,即TRUE
。
实际上,这两个表达式都可以满足您的需求(不是null,或者如果为null,则不应该使用任何约束):
WHERE date_col IS NULL OR date_col > :date
-- vs:
WHERE date_col > :date OR date_col IS NULL
布尔表达式(
AND
/OR
/NOT
在这些条款组合)可以通过布尔代数的法律允许的任何方式进行重组。
这也适用于PostgreSQL 8.4。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句