为什么雪花在 WHERE 子句中排除匹配的 NULL 值?



假设我有一个名为people的表,其中 Name 列中的一个值是null

ID Name
约翰一
2 玛丽
3 null

所有数据库处理NULL的方式都是一样的(嗯,差不多)。 几乎任何涉及NULL的比较 - 除了IS NULLIS NOT NULL以及其他一些显着的例外 - 返回NULLWHERE子句和CASE表达式将NULL值视为"false"。

幸运的是,Snowflake还实现了标准的SQLNULL-safe运算符IS DISTINCT FROM。 因此,您可以将逻辑编写为:

SELECT p.*
FROM people p
WHERE Name IS DISTINCT FROM 'John'

当每次与 null 的比较都返回 false 时,这是常见的数据库预期行为。

换句话说:

if some_variable = null -- always false even if some_variable was assigned null
if some_variable <> null -- always false

这是因为"空"意味着"无",很难将无与无进行比较。

正如我从文档中看到的那样,您可以通过使用 NVL 函数来避免编写"或名称为 null",该函数接受 2 个参数,如果第一个参数为 null,则返回第二个参数。

例如:

nvl(1, 3) = 1
nvl(null, 3) = 3

因此,您的查询可能如下所示:

SELECT * FROM people WHERE nvl(Name,'John') <> 'John';

Snowflake创建了EQUAL_NULL(),这使得NULL 处理变得更加容易。从文档中:

比较两个表达式是否相等。该函数是空安全的, 这意味着它将 NULL 视为用于比较相等性的已知值。注意 这与 EQUAL 比较运算符 (=) 不同,后者 将 NULL 视为未知值。

要否定它,请使用NOT()

SELECT * FROM people WHERE NOT(EQUAL_NULL(Name,'John'))

最新更新