我有这两个表school_classes
和classes
。
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