即使条件满足,NULL值也不会作为查询的一部分

时间:2017-02-22 21:52:17

标签: sql hadoop hive

我有简单的查询来获取所有不是' RS'在蜂巢中。我的数据如下所示

Account                 class
3000337430920208808     NULL
3000337394422514891     NULL
3000337317010916590     NULL
3000337153318453626     NULL
3000337129720896321     NULL

我已将查询编写为

select account_number,service_class from cdx_eligibility where   account_number='3000337430920208808' and service_class not in ('RS');

我没有获得此帐户的输出。理想地为NULL<> RS(所以它的真实和应该返回记录)。但我没有得到任何记录。我们需要以不同的方式处理NULLS吗?我也尝试了几个选项(!=,<>,而不是)。请建议。

2 个答案:

答案 0 :(得分:0)

看起来hive无法正确处理“in”子句中的空值,此解决方法应该可以正常工作

select account_number,service_class from cdx_eligibility where   account_number='3000337430920208808' and (isnull(service_class ) or service_class not in ('RS'));

答案 1 :(得分:0)

这不是Hive问题,这就是SQL的工作原理。当您将'RS'与null进行比较时,它不会返回任何内容,不会返回true或false。你也不能'foo' = null。这是为什么在字符字段中允许空值是一个痛苦的原因之一。如果您必须有空值,请使用

where coalesce(service_class,'') not in ('RS')

这样你就可以将空字符串与'RS'进行比较,它可以按照您的预期运行。