PostgreSQL中含NULL的IN与NOT IN结果差异原因咨询
PostgreSQL中IN与NOT IN含NULL时的结果差异解析
IN操作的结果逻辑
执行select 'Clark' in ('Dave', null, 'Clark');返回TRUE的原因很明确:
- IN操作符的核心逻辑是只要目标值与集合中任意一个元素相等,就返回TRUE
- 这里集合里明确存在
'Clark',直接匹配成功,集合中的NULL不会影响这个确定的匹配结果,因此返回TRUE
NOT IN操作的结果逻辑
执行select 'Ava' not in ('Dave', null, 'Clark');返回NULL,问题出在PostgreSQL中NULL参与比较的特殊性:
- NOT IN等价于对IN的结果取反,拆解为逻辑表达式就是:
NOT ('Ava' = 'Dave' OR 'Ava' = NULL OR 'Ava' = 'Clark') - 逐个分析比较结果:
'Ava' = 'Dave'→FALSE'Ava' = NULL→ NULL(PostgreSQL中任何值与NULL做相等比较,结果都是NULL——因为NULL代表“未知”,无法确定两者是否相等)'Ava' = 'Clark'→FALSE
- 计算OR逻辑:
FALSE OR NULL OR FALSE→ 结果为NULL(OR逻辑中只要存在NULL,整体结果就是NULL,因为未知的存在无法确定整体是否为真) - 对NULL取反:
NOT NULL→ 结果仍为NULL,因此最终返回NULL
核心结论
- IN遇到明确匹配值时,直接返回TRUE,不受集合中NULL的干扰
- NOT IN只要集合包含NULL,且目标值不在集合的非NULL元素中,结果就会是NULL——因为NULL带来的不确定性无法被排除
内容的提问来源于stack exchange,提问作者Akbar Ergashev
相关产品推荐
相关产品推荐

