Ral*_*lph 1 sql snowflake-cloud-data-platform
假设我有一个名为的表people,其中“名称”列中的值之一是null:
| ID | 姓名 |
|---|---|
| 1 | 约翰 |
| 2 | 玛丽 |
| 3 | null |
我想选择名称不等于“John”的所有行,所以我这样做:
SELECT * FROM people WHERE Name <> 'John'
Run Code Online (Sandbox Code Playgroud)
在 Snowflake 中,这仅返回“Mary”并排除 具有 Name 值的最后一行null。如果我想包含null值(预期行为),我必须这样做:
SELECT * FROM people WHERE (Name <> 'John' OR Name is NULL)
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?有谁知道如何配置 Snowflake 以返回 NULL 行?
因为根据定义,缺少值(即 NULL)应该与条件匹配Name <> 'John'
所有数据库都以NULL相同的方式处理 s(嗯,几乎如此)。几乎所有的比较都涉及NULL——除了IS NULL和的显着例外IS NOT NULL以及其他一些NULL)都会返回。 WHERE子句和CASE表达式将NULL值视为“false”。
幸运的是,Snowflake 还实现了标准 SQLNULL安全运算符IS DISTINCT FROM. 所以你可以将逻辑写为:
SELECT p.*
FROM people p
WHERE Name IS DISTINCT FROM 'John'
Run Code Online (Sandbox Code Playgroud)