NULL 列值通过 != 运算符过滤。过滤 LEFT JOIN 结果的正确方法? [重复]

问题描述 投票:0回答:1

我使用 sqlite 来过滤对象。现在我在过滤 LEFT JOIN 的结果时遇到问题。

UPD:好的,我明白为什么会发生这种情况,但我想知道在 LEFT JOIN 后过滤结果的正确方法是什么。

没有过滤器,我同样选择了表格:

身份证 道具
1 “一个”
1 “b”
2 “c”
3
4

我使用以下 WHERE 过滤器从该表中获取 prop 不等于“b”的行。 我在 WHERE:

WHERE prop != 'b'
中使用以下表达式,我希望结果如下表:

身份证 道具
1 “一个”
2 “c”
3
4

但出乎我意料的是,结果不包括3和4个id:

身份证 道具
1 “一个”
2 “c”

为什么会发生这种情况,我该怎么办?将

prop != 'b'
更改为
prop != 'b' OR prop IS NULL
看起来很奇怪。

我不明白,sql 库过滤这样的行的动机是什么,因此无法理解是否有比上面转换过滤表达式更好的东西。

sql sqlite
1个回答
0
投票

SQL 中的经验法则是,使用

NULL
=
将列与
!=
进行的任何比较都是 未知。 这是因为
NULL
本身在语义上代表 SQL 中的未知值。

因此,

WHERE prop != 'b'
NULL
值的条件
prop
评估为“未知”,默认情况下将其视为不正确或错误。

需要明确的是:

prop | expression  | result
NULL | prop = 'b'  | FALSE
NULL | prop != 'b' | FALSE
'b'  | prop = 'b'  | TRUE
'c'  | prop != 'b' | TRUE
© www.soinside.com 2019 - 2024. All rights reserved.