我的公司有一个在Hive SQL中构建一些SQL的软件。 左部分是灵活的,可以是任何类型(例如字符串),因为我可以自由存储或转换。 正确部分不灵活,因为它只能在SQL语句中使用('a','b','c')
。所以我可以在concat_ws('a','b','c')
之类的函数前面添加它,但是我无法删除它周围的括号(..)
。
我想做两个场景:
('a','b')
是 ('a','b','c')
的子集。所以这将返回TRUE
。但是,('a','d')
是 ('a','b','c')
的子集将返回FALSE
,因为d
在右侧不存在。('a','b')
至少有一个元素 ('a','b','c')
。这会返回TRUE
,因为a
或b
位于右侧。但('d','e')
('a','b','c')
中至少有一个元素为FALSE
。有没有办法在不编写UDF或添加第三方UDF的情况下执行此操作?
我正在考虑将它们转换为小写并进行比较,因为'ab'
是'abc'
的子串(丑陋的解决方法):
select instr(concat_ws('|',sort_array(array('B','A','C'))),'A|B')>0;
返回TRUE
select instr(concat_ws('|',sort_array(array('B','A','C'))),'A|E')>0;
返回FALSE
但第二种情况更难。我猜是否:
|
奇怪但只是一个想法!
答案 0 :(得分:0)
您可以查看内置表格生成函数(UDTF)。例如,explode
将为数组explode(array ('a', 'b'))
的每个元素创建一行。从那以后,你可以使用通常的SQL-fu。
完整示例,实际上适用于两种情况:
with abc as (
select explode(array('a', 'b', 'c')) as l
)
select
count(*) = size(array('a', 'b')) as case1
, count(*) > 0 as case2
from
abc
where l in
('a', 'b') -- true, true
-- ('a', 'd') -- true, false
-- ('d', 'e') -- false, false
;