我在读这篇文章: SQL中获取null == null + Q+ @- y+ H$ `9 t5 g
共识是,当试图测试两个(可空)时sql正确的方法是:2 ]# Z7 P6 q7 j' E& y
where ((A=B) OR (A IS NULL AND B IS NULL))当A和B为NULL时,(A = B)仍返回FALSE,因为NULL不等于NULL。这就是为什么需要额外的检查。 1 O% o" c5 S& k4 e如何检验不平等?经过以上讨论,我认为我需要做一些类似的事情来测试不平等:7 I3 E1 h+ b5 q- u, Q
WHERE ((A B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))但是,我注意到这不是必需的(至少在informix 11.5上没有),我可以这样做: 6 i/ F. B; B& r+ [4 b$ Y$ A( dwhere (AB)如果A和B为NULL,则返回FALSE。如果NULL不等于NULL,所以这不应该回来TRUE吗? ' O1 E) q! m6 S' i8 I0 \3 I p编辑 4 G' ?0 s: L0 \, b8 ]: @这些都是很好的答案,但我觉得我的问题有点模糊。请允许我重写: : W6 `0 n7 z9 F0 F# @4 x" }- W假设A或B可以为NULL,是否足以检查它们的不等式 ) p# G( W( @7 g9 V+ Nwhere (AB)或者我需要像这样检查它:* e. K# j$ h- Z
WHERE ((A B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL)) 4 j) y0 }+ t Q0 v: O8 c( Y 解决方案: 8 B% P# W/ I" n) t8 J* T* h 涉及NULL事实上,关系表达式又产生了NULL4 h' M5 |( o. J; E& @, X
编辑 * {( F! U8 J$ L, |在这里,代表任何二进制运算符,NULL是SQL占位符,value是任何值(NULL一个值): * D* H6 C' @( c8 j7 |. Q5 b FNULL value -> NULL3 V4 Z7 J7 o6 Z' N: g
NULL NULL -> NULL& V' l0 `, O) k# G! M( F; H# `9 o, W. H/ y
逻辑是:NULL表示无值或未知值 : o2 x8 y( _5 A/ {7 ^2 f0 ^! Y4 d9 LX = 42假设你不知道它有什么值(如果有)true,false还是未知X?SQL表示未知。X = Y假设两者都是未知的,那是真的,假的还是未知的?SQL结果是未知的。这只是逻辑上的(即使在模型中NULL不在首位)。" {2 W/ b& h# w7 h
SQL还提供了两个一元后缀运算符IS NULL和IS NOT NULL,它们根据其操作数返回TRUE或FALSE。 $ k, l7 f+ |4 T; cNULL IS NULL -> TRUE : t, ~2 _$ Q8 m2 ? o3 |0 hNULL IS NOT NULL -> FALSE