我使用 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 中的经验法则是,使用
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