首先,创建两个表。
CREATE DATABASE IF NOT EXISTS test;
USE test;
DROP TABLE IF EXISTS student_info;
CREATE TABLE IF NOT EXISTS student_info(
id string COMMENT 'student id',
name string COMMENT 'student name'
)
PARTITIONED BY (l_date string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
ALTER TABLE test.student_info SET SERDEPROPERTIES('serialization.null.format' = '');
DROP TABLE IF EXISTS student_score;
CREATE TABLE IF NOT EXISTS student_score(
id string COMMENT 'student id',
class string COMMENT 'class',
score int COMMENT 'class score'
)
PARTITIONED BY (l_date string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
ALTER TABLE test.student_score SET SERDEPROPERTIES('serialization.null.format' = '');
学生信息表中有4条记录,
1 jobs
2 cook
3 gates
4 musk
学生成绩表中有3项记录,
1 math 98
2 math 96
3 math 94
我要找一个没有分数,id是4的学生。
select * from test.student_info a
left join test.student_score b
on a.id=b.id
where (b.id='' or b.id is null)
and a.id='4';
我什么都没有。但是,我添加了“trim()”。
select * from test.student_info a
left join test.student_score b
on a.id=b.id
where (b.id='' or b.id is null)
and trim(a.id)='4';
我能得到我想要的。
a.id a.name b.id b.class b.score
4 musk NULL NULL NULL
所以,我认为有一个错误。
3条答案
按热度按时间kcwpcxri1#
最好的解决方案是将id的数据类型改为int,我不明白为什么我只看到id的
通过这种方式,您可以确保在不修剪它们的情况下对它们进行比较
eblbsuwk2#
就像亚历克斯说的,你一定有空位。我尝试了你发布的关于类似rest数据的查询,得到了想要的结果。
或者,您也可以使用以下查询:
f0brbegy3#
看来你的数据
test.student_info
表在ID之前或之后有空格。这就解释了为什么a.id='4'
是假的,而trim(a.id)='4'
这是真的。如果从文件加载表,请检查是否没有多余的空间。