与字符串的 Lower(null) 比较不 return 行

Lower(null) comparison with string does not return row

我有这两个表 school_classesclasses

school_classes
------------------------
id | class_id 
 1 |  2
 2 |  1

classes
------------------------
id | status    | name
 1 | null      | A
 2 | null      | B
 3 | Active    | C 
 4 | Cancelled | D

这是我正在尝试的查询,

select
    c.status, c.name
from
    school_classes sc
join classes c on
    sc.class_id = c.id and (LOWER(c.status) != 'cancelled')
where
 sc.id = 1

对于上面的查询,它return的结果是空的。但我的理解是 lower(null) 将是 'null' 不等于 'cancelled' 所以它应该是 return 行。

当我将状态从 null 更改为其他字符串时,该行被 returned.

如果要检索空值,可以检查它们,如:

select
    c.status, c.name
from
    school_classes sc
join classes c on
    sc.class_id = c.id
 and (LOWER(c.status) != 'cancelled' or c.status is null) 
where
 sc.id = 1

my understanding that lower(null) will be 'null' ...

它将是 NULL,而不是 'null'。缺少引号很重要,表示它不是字符串,而是真正的 NULL 值 - 或 null,大小写无关紧要。
有多种修复方法,IS NOT TRUE 可能是最简单的:

AND (lower(c.status) = 'cancelled') IS NOT TRUE

额外的括号是可选的,因为 operator precedence 无论如何都对我们有利。

参见:

  • Best way to check for "empty or null value"