回答

收藏

为什么null不等于null false

技术问答 技术问答 210 人阅读 | 0 人回复 | 2023-09-14

我在读这篇文章: 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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则