PostgreSQL中IS NOT TRUE与!= 't'返回结果不同的原因
PostgreSQL中NULL与比较运算符的行为解析
是的,PostgreSQL里标准比较运算符(=、!=、<>等)无法直接匹配NULL值,核心原因是SQL遵循三值逻辑(True/False/Unknown),而NULL代表“未知值”,具体到你的场景:
- 当用
!= 't'或<>'t'比较时:因为drink_deleted是NULL,任何和未知值的比较结果都是Unknown,而WHERE子句只会保留运算结果为True的行,所以这两个语句不会返回目标行。 - 当用
IS NOT TRUE时:这是PostgreSQL针对布尔类型(或可隐式转换为布尔的字段)的特殊判断逻辑,它会把NULL视为“非True”的情况,此时运算结果为True,因此能返回目标行。
如果需要用类似比较运算符的逻辑处理NULL场景,有两种常用方法:
- 使用
IS DISTINCT FROM运算符:它会把NULL当作可比较的确定值,比如drink_deleted IS DISTINCT FROM 't',此时NULL的情况会返回True,能筛选出目标行。 - 用
COALESCE函数转换NULL:比如COALESCE(drink_deleted, 'f') != 't',把NULL替换成一个确定的默认值(比如'f')后再进行比较。
内容的提问来源于stack exchange,提问作者Anunnaki Priest
相关产品推荐
相关产品推荐

