select * from (select 'test' as clo_name union all select 'test1' as clo_name union all select null as clo_name) as a where clo_name <> 'test' ;

select * from (select 'test' as clo_name union all select 'test1' as clo_name union all select null as clo_name) as a where clo_name not in ('test') ;

clo_name字段 取不等于某个值或者not in 某个(些)值的时候, 类似上面这种sql写法,是取不到 clo_name字段为null的记录的,如果需要取到clo_name字段为null的记录,需要做null值处理 ,如下:

select * from  table  coalesce(clo_name ,'') <> 'test' ;

select * from table  coalesce(clo_name ,'') not in ('test');

或者,将clo_name列的null值处理,提前到数仓中间层处理掉,比如将null值统一处理成’NA‘,后续在使用就不用再考虑这些问题。

所以,我们在日常开发中,要处理这种不等于或not in 的问题的时候需要特别注意,否则很容易跟预想的结果不一致,且不易发现的bug。

// 测试用例如下 // 设置元数据服务 Delegate.getDelegate().setMetaColumnService(new IMetaColumnService() { @Override public List<String> queryMetaColumn(String dbName, String tableName) { return Collections.emptyList(); @Override public boolean clearMetaColumnCache() { return true; // 设置通知服务 Delegate.getDelegate().setNoticeService(s->{}); // 具有子查询的 sql String hql = "select id,name from (select id from table_1 where id={p0}) t1 inner join (select name --this is name\n from table_2) t2"; // 获取id字段的血缘 LineageNode idNode = Delegate.getDelegate().getLineage(hql, "id"); // 获取name字段的血缘 LineageNode nameNode = Delegate.getDelegate().getLineage(hql, "name"); // 打印血缘 Utils.printLineage(idNode,nameNode); 有次使用 hive 查询数据时,在对字段进行条件过滤时,遇到了一个问题。是这样的,表中有个字段数据类型为string,里面存放的值有数字,null(空值),‘’(空串),在对字段进行条件过滤时,结果并不是我期望的。现在进行简单地总结下:数据准备:create table test.tb_user as select '1' as user_id, 'aikaifa' as user_n... 1.等值比较: = 语法:A=B 操作类型:所有基本类型 描述: 如果表达式A与表达式B相等,则为TRUE;否则为FALSE 举例: hive >select 1 from lxw_dual where 1=1; 12.不等值比较: <> 语法:... hive 表关联条件不支持不等值连接 不等式:(>=,>,<=,<,<>,between..and) 场景:oracle里面的 SQL 转化成 hive SQL 中,关联时ON里面的条件如果含有不等值,那么在 hive 中不能直接使用,如果将不等式放在where条件中,造成下面描述问题: 直接将不等值连接放在where条件中会过滤掉主表的部分数据, 解决方案: 需要先通过i...... 通常,我们在写 sql 的时候用where过滤 不等于 的条件,都会使用"!=" 或者 “<>”。我们也都知道hql和my sql 有很大共同之处,但是,往往就会出现一些意料之外的事情。 hive 的" 不等于 " !或<> 会把null值也去掉,所以要加上 where rate!=‘D’ or rate is null; 或者where rate<>‘D’ or rate is null; NULL这一行不会记到最终的输出结果里,这可能和我们的初衷有偏差,我们只是不要a,b的这个集合,这样算出的结果会少于我们理想的输出结果。如果是whereanotin(‘a’,‘b’)的时候,如果a列有NULL值的时候,这时候。whereain(‘a’,‘b’)指的是就只筛选出a等于a和b的集合,这个来说没什么问题。in和notin返回的是布尔值,在遇到NULL值的时候不会返回true和false。 hive sql 在编写过程中难免会使用到in和notin的操作。... Hive 中的not in函数有一个隐藏的陷阱,当not in() 中的数值包含NULL,匹不上的数据会返回NULL而不是True。 所以当在where中使用not in子查询进行筛选,一定要记得去除NULL值。 样例代码: --not in的原始结果 select num,num not in (null,'2'), num not in (null,'2') and true from (sel... 1 建议用left join代替 ,主表要为大表,然后附表中的字段为null晒选出去这样就可以查出not in 的数据 SELECT a.court_id, sum(if(a.id_count >= 1, 1, 0)) house_count, a.day_time from ( select 错误1.如果有多层AND和OR,需要注意括号,用AND链接多个括号内(OR)条件 错误2.确认原表字段类型,where条件中原表字段类型为bigint,查询条件写成字符串时,会被转为double进行匹配,此时会丢失精度,使结果错误。 注:该问题可以通过执行计划看出,附经典例图 这种操作如果直接使用join的话语法不支持 不等于 操作, hive 语法解析会直接抛出错误 如果把 不等于 写到where里会造成笛卡尔积,数据异常增大,速度会很慢。甚至会任务无法跑成功~ 二、mapjoin的计算原理 MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。这种情