Sql 基于部分字符串匹配联接两个表
我有两个表,我在其中保存haddop配置单元上的一些表的计数。 表1列:日期、表格、计数(表格名称小写) 我的第二个表具有相同的形状:date、table、count(其中表名为大写)Sql 基于部分字符串匹配联接两个表,sql,hive,hiveql,Sql,Hive,Hiveql,我有两个表,我在其中保存haddop配置单元上的一些表的计数。 表1列:日期、表格、计数(表格名称小写) 我的第二个表具有相同的形状:date、table、count(其中表名为大写) 02/07/2018 TABLENAME1 200 02/07/2018 TABLENAME2 10 我想要张新桌子 Tablename\u T1 Tablename\u T2 CountT1 CountT2 DateT1 DateT2 表名1表名1 300 200 01/07/18 02/07/2018 表名
02/07/2018 TABLENAME1 200
02/07/2018 TABLENAME2 10
我想要张新桌子
Tablename\u T1 Tablename\u T2 CountT1 CountT2 DateT1 DateT2
表名1表名1 300 200 01/07/18 02/07/2018
表名2表名2 100 0 01/07/18 02/07/2018
我尝试了这个查询,但它不起作用
选择*
从计数表a到计数表2 b
其中a.tablename类concat(“%”,b.tablename,“%”)
谢谢如果a.nom_表有可预测的顺序,那么我们可以这样写
select *
from count_tables a, count_tables2 b
where substr(a.nom_table,7,length(a.nom_table))=lower(b.nom_table)
使用instr()
函数
select *
from count_tables a
inner join count_tables2 b on a.datet1=b.datet2
where instr(a.tablename,b.tablename) > 0
如果不希望表a
中的每个日期与表b
中的每个日期重复,请在a.datet1=b.datet2上向联接条件添加日期
也可以使用locate(string substr,string str[,int pos])
函数:
where locate(b.tablename, a.tablename) > 0
它不起作用。第二个表的nom_table列中有大写字母。我根据您的要求编辑了我的查询。您能尝试一下吗。为什么您的意思是它不起作用。是语法错误吗?语法正确。输出完成。结果为0。我真的不知道问题在哪里。我想知道是否可以更改e查询日期的联接。表1在日期1,表2在日期2-1?感谢您的支持help@Dora当然可以。使用date\u sub(b.date2,1)
对不起,我有这个错误“失败:ClassCastException org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableStringObjectInspector无法强制转换为org.apache.hadoop.hive.serde2.objectinspector.primitive.BooleanObjectInspector“@Dora请提供您的查询。例外情况表明您使用字符串代替布尔值。错误where语句可能此查询有效,但不给我第3天时间”从表1中选择*一个内部联接表2 b其中a.nom_table=较低(b.nom_table)和a.日期子(b.日期
,3);”
where locate(b.tablename, a.tablename) > 0