1

我正在进行以下选择查询:

select date(al.created_on) date, a.name appname, u.regcode rc, u.email_address ea from audit_logs al 
JOIN users u ON al.user_id = u.id
JOIN applications a ON al.application_id = a.id
group by date, appname, ea
order by date DESC, appname, ea;

并获得超过 900 个结果,其中“u.regcode rc”的许多值为 NULL。

我还需要过滤掉特定的 regcode 并将查询更改为:

select date(al.created_on) date, a.name appname, u.regcode rc, u.email_address ea from audit_logs al 
JOIN users u ON al.user_id = u.id
JOIN applications a ON al.application_id = a.id
WHERE u.regcode != '9999'
group by date, appname, ea
order by date DESC, appname, ea;

但是现在所有 u.regcode 为 NULL 的结果也被过滤掉了。即使我将 WHERE 子句更改为“ WHERE u.regcode = NULL ”,NULL 值也会被过滤掉,我什么也得不到。

有没有一种方法可以过滤掉 u.regcode-column 的特定值而不会丢失具有 NULL 值的行?

4

1 回答 1

3

所有与 null 的比较都评估为 false (或者,更准确地说,它们评估为unknown,这意味着它们不评估为 true,这意味着它们的行为类似于 false 但使用这些表达式的任何其他布尔运算也评估为 unknown),包括平等和不平等的比较。这是 SQL 较难掌握的方面之一,但从根本上说null是缺失值。就 SQL 服务器而言,可能一个值,但它没有它,因此该值是unknown。因为它不知道值是什么,所以它不知道它是等于、小于还是大于任何其他值。

要将值与 null 进行比较,您需要使用is nullis not null

因此,对于您的查询,您可以使用

where u.regcode != 9999 or u.regcode is null
于 2012-09-07T13:27:04.290 回答