与字符串的 Lower(null) 比较不 return 行
Lower(null) comparison with string does not return row
我有这两个表 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
对于上面的查询,它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"
我有这两个表 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
对于上面的查询,它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"