返回任何非’的元素;t包含在两列SQL中
我在一个表中有两列,我想创建第三列,其中包含两列中未包含的任何元素。例如:两列的第一行如下所示:返回任何非’的元素;t包含在两列SQL中,sql,arrays,string,hiveql,unnest,Sql,Arrays,String,Hiveql,Unnest,我在一个表中有两列,我想创建第三列,其中包含两列中未包含的任何元素。例如:两列的第一行如下所示: Col1: [‘apple’,’banana’,’orange’,’pear’] Col2: [‘apple’,’banana’] 它将返回: Col3: [‘orange’, ‘pear’] 本质上与数组_相交函数相反。我在php中见过array_diff,所以我想知道sql中是否有一个等价的函数?如果您有一个主键,那么我认为这将满足您的需要: select t.pk, collect_set
Col1: [‘apple’,’banana’,’orange’,’pear’]
Col2: [‘apple’,’banana’]
它将返回:
Col3: [‘orange’, ‘pear’]
本质上与数组_相交函数相反。我在php中见过array_diff,所以我想知道sql中是否有一个等价的函数?如果您有一个主键,那么我认为这将满足您的需要:
select t.pk, collect_set(case when c2.el is null then c1.el end)
from (t lateral view
explode(t.col1) c1 as el
) left join
(t t2 lateral view
explode(t2.col2) c2 as el
)
on t.pk = t2.pk and
c1.el = c2.el
group by t.pk;
分解col1并使用array\u contains+case语句,使用collect\u set或collect\u list再次组装数组 演示: 结果:
col1 col2 col3
["apple","banana","orange","pear"] ["apple","banana"] ["orange","pear"]
否,上面的示例显示了表的第一行。每行由一个数组组成,每个数组具有不同数量的元素。它们是使用“collect_set”函数形成的数组
col1 col2 col3
["apple","banana","orange","pear"] ["apple","banana"] ["orange","pear"]