2017-10-20 29 views
1

我在AWS一个蜂房表名为table1仅带有一列,它看起来像图所示:蜂房在自动过滤NULL NOT IN条件

COL1 
(null) 
active 

试图下面查询

select * 
from table1 
where COL1 NOT IN ('reversed') 

蜂房是返回只有一行

COL1 
active 

为什么它不返回记录(null)?

我知道修正是修改条件如下。但我想调试这个问题,以便这不会对其他查询

where coalesce(COL1,"") NOT IN ('reversed') 

回答

1

这是所有RDBMS系统如何对待null值发生。

null有着特殊的意义 - 像not defined

当您检查:

COL1 NOT IN ('reversed') 

以下比较将进行:

(null) != reversed 
active != reversed 
... 

,只有那些返回true会返回:

scala> spark.sql("SELECT 'active' != 'reversed'").show 
+-------------------------+ 
|(NOT (active = reversed))| 
+-------------------------+ 
|      true| 
+-------------------------+ 


scala> spark.sql("SELECT null != 'reversed'").show 
+---------------------------------------+ 
|(NOT (CAST(NULL AS STRING) = reversed))| 
+---------------------------------------+ 
|         null| 
+---------------------------------------+ 

,你可以看到:(null) != 'reversed'不返回true - 这就是为什么你没有看到它在结果集中

此外:

scala> spark.sql("SELECT (null) = 'reversed'").show 
+---------------------------------+ 
|(CAST(NULL AS STRING) = reversed)| 
+---------------------------------+ 
|        null| 
+---------------------------------+ 

正因为如此,我们有IS NULLIS NOT NULLCOALESCE等方法和功能,允许我们使用NULL

+0

谢谢澄清!它有帮助。 – Neena