我的 PySpark 笔记本中有一个TempView
。当我在视图上运行 SQL 查询时,WHERE
以下条件不会产生预期的结果:
is_valid != false
对于传入的记录,is_valid
列(BooleanType
字段)包含一个null
值。我期望条件is_valid != false
计算为,true
因为null
显然不等于false
,对吗?
然而,事实并非如此。相反,它的计算结果为false
。
我不确定我的情况出了什么问题。有什么想法吗?
我的 PySpark 笔记本中有一个TempView
。当我在视图上运行 SQL 查询时,WHERE
以下条件不会产生预期的结果:
is_valid != false
对于传入的记录,is_valid
列(BooleanType
字段)包含一个null
值。我期望条件is_valid != false
计算为,true
因为null
显然不等于false
,对吗?
然而,事实并非如此。相反,它的计算结果为false
。
我不确定我的情况出了什么问题。有什么想法吗?
此行为是由于 SQL 处理涉及的比较的方式造成的
NULL
。任何与 的比较
NULL
结果都为FALSE
。这是因为NULL
表示未知值,并且 SQL 无法确定它是否等于其他任何值。此外,在 SQL 中,您不需要明确将布尔列与
TRUE
或进行比较FALSE
。列本身充当条件。例如,不要这样写:
您可以将其简化为:
但是,如果您想要包含行,其中
is_valid
是NULL
,则需要使用以下命令明确处理:这将确保您的结果中包含
TRUE
和NULL
值。我在这里使用 SQL 语法,但同样适用于 pyspark 函数。
WHERE
子句应该对列进行评估TRUE
,is_valid
那么TRUE
您NULL
可以执行以下操作:WHERE is_valid IS NULL or is_valid
(同上WHERE is_valid IS NULL or is_valid = TRUE
)WHERE COALESCE(is_valid, TRUE)
(同上WHERE COALESCE(is_valid, TRUE) = TRUE
)