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阶段直接拿另外一个表的数据和内存中表数据做匹配。这种情