与字符串的低位(null)比较不返回行



我有这两个表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

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

当我将状态从null更改为其他字符串时,就会返回该行。

我的理解是lower(null)将是'null'。。。

它将是NULL,而不是'null'。缺失的引号很重要,表示它不是字符串,而是真正的NULL值——或者null,大写并不重要
有多种方法可以修复,最简单的可能不是真的:

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

额外的括号是可选的,因为运算符优先级无论如何都对我们有利。

参见:

  • 检查";空值或空值">

如果您想检索null,可以检查它们,如:

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

最新更新