未使用 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 NULL
或 column 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 个按顺序检查的项目)
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 NULL
或 column 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 个按顺序检查的项目)