GridDB中NOT BETWEEN返回含NULL的异常行,与等价OR查询结果不符
GridDB中NOT BETWEEN与等价OR条件对NULL的处理差异
问题现象
在GridDB的SQL查询中,两个逻辑上等价的过滤条件返回结果不一致,差异集中在列值为NULL的行:
使用
NOT BETWEEN的查询:SELECT * FROM my_container WHERE NOT (some_column BETWEEN 10 AND 20);该查询会返回
some_column为NULL的行。使用等价OR逻辑的查询:
SELECT * FROM my_container WHERE some_column < 10 OR some_column > 20;该查询会正确排除
NULL值的行。
预期与实际结果
- 预期结果:两个查询应返回完全相同的结果集,仅包含
some_column值小于10或大于20的行。 - 实际结果:
NOT BETWEEN版本返回包含NULL值的额外行;- OR版本正确排除
NULL值; - 两个结果集不一致。
原因解析
这是因为GridDB对BETWEEN和NULL的处理遵循了SQL**三值逻辑(True/False/Unknown)**的特定实现:
- 当
some_column为NULL时,some_column BETWEEN 10 AND 20的计算结果是Unknown。对Unknown取NOT后,结果仍然是Unknown。 - 在GridDB的WHERE子句中,会将Unknown视为True,因此包含这些NULL行。
- 而在OR条件中,
some_column < 10和some_column > 20当列值为NULL时,结果都是Unknown。OR逻辑仅在至少一个条件为True时返回True,两个Unknown的OR结果还是Unknown,此时GridDB将其视为False,因此排除这些NULL行。
是否为预期行为
这属于GridDB的预期行为,其对三值逻辑的处理方式导致了这种直观上的“不等价”结果。如果需要让NOT BETWEEN版本也排除NULL行,需要显式添加NULL过滤条件:
SELECT * FROM my_container WHERE NOT (some_column BETWEEN 10 AND 20) AND some_column IS NOT NULL;
内容的提问来源于stack exchange,提问作者Nooruddin Lakhani
相关产品推荐
相关产品推荐

