未使用 WHERE 语句过滤掉 NULL 值

NULL values not filtered out with WHERE statement

SELECT ID, VOLUME,  TYPEOF(VOLUME) FROM DBT.BASE 

当我 select 这些列时,我看到结果有一些 NULL 值。它们似乎不是字符串。但是,当我尝试使用 where 语句过滤掉 NULL 值时:

SELECT ID, VOLUME,  TYPEOF(VOLUME) FROM DBT.BASE WHERE VOLUME = NULL

我没有看到任何结果。可能的原因是什么?我还尝试使用 'NULL' 进行过滤,但由于列类型为双精度,这会引发错误。

仅用于 null 重新编码

SELECT ID, VOLUME,  TYPEOF(VOLUME) FROM DBT.BASE WHERE VOLUME IS NULL
or
SELECT ID, VOLUME,  TYPEOF(VOLUME) FROM DBT.BASE WHERE ISNULL(VOLUME,'') = ''

如果你得到的不是空值,那么使用

SELECT ID, VOLUME,  TYPEOF(VOLUME) FROM DBT.BASE WHERE ISNULL(VOLUME,'') <> ''
or 
SELECT ID, VOLUME,  TYPEOF(VOLUME) FROM DBT.BASE WHERE VOLUME IS NOT NULL

您可以使用where is函数或is not函数来过滤所有的空值。

更完整的答案是 NULL 不能直接比较,就像 NaN 在浮点数中不可比较一样。两者都代表“缺乏价值”,如果你“这里没有价值”,你怎么能将它与某物进行比较。

“你旁边没有人,他们叫什么名字?”它只是没有意义。

所以要测试你问 column IS NULLcolumn IS NOT NULL 或者你可以使用紧凑的逻辑表达式见 Conditional Expressions 但 Snowflake 中一些常见的是:

short form ANSI long snowflake long
NVL(column,'') CASE WHEN column IS NOT NULL THEN column ELSE '' END IFF(column IS NOT NULL, column, '')
NVL2(column,'a','b') CASE WHEN column IS NOT NULL THEN 'a' ELSE 'b' END IFF(column IS NOT NULL, 'a', 'b')
ZEROIFNULL(column) CASE WHEN column IS NOT NULL THEN column ELSE 0 END IFF(column IS NOT NULL, column, 0)

COALESCE/NVL/IFNULL 都是可以互换的,所以我只展示一个(预计 COALESCE 可以处理 N 个按顺序检查的项目)