在sql中检查不为空?

时间:2015-01-13 15:06:23

标签: sql postgresql

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吗?

1 个答案:

答案 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组合)可以用布尔代数定律允许的任何方式重新组织。

这也是becauseapplies