假设我有一个名为people
的表,其中 Name 列中的一个值是null
:
ID | Name |
---|---|
约翰一 | 书 |
2 | 玛丽 |
3 | null |
所有数据库处理NULL
的方式都是一样的(嗯,差不多)。 几乎任何涉及NULL
的比较 - 除了IS NULL
和IS NOT NULL
以及其他一些显着的例外 - 返回NULL
。WHERE
子句和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'))