当字符串来自其他表时,Hive like无法正常工作

时间:2018-09-18 06:07:30

标签: hive

我在蜂巢中遇到一个奇怪的问题

a

id, domain
1,  m.taobao.com
2,  m.tmall.com

表b

domain
%taobao\\.com%
%tmall\\.com%

当我使用时:

Select a.id, a.domain from a where a like '%taobao\\.com%' or a.like '%tmall\\.com%' 

效果很好

但是当我使用

select a.id, a.domain from a, b where a.domain like b.domain

我返回null。

b.domain'%taobao\\.com%''%tmall\\.com%'。在SQL查询中直接使用它们有什么不同?是什么使第二个查询失败?

1 个答案:

答案 0 :(得分:0)

在模板中没有'\\'的情况下效果很好:

select a.*
from
(--Use your table instead of this subquery
  select stack(2,
              1,  'm.taobao.com',
              2,  'm.tmall.com') as (id, domain)
)a
cross join 
(--Use your table instead of this subquery
 select stack(2,
              '%taobao.com%',
              '%tmall.com%'
              ) as domain
) b
where a.domain like b.domain;

结果:

OK
1       m.taobao.com
2       m.tmall.com

与常量模板相同。这不会产生行:

select a.*
from
(--Use your table instead of this subquery
  select stack(2,
              1,  'm.taobao.com',
              2,  'm.tmall.com') as (id, domain)
)a
where a.domain like '%taobao\\.com%'

这很好用:

where a.domain like '%taobao.com%'

DocumentationLIKE运算符只能识别_%模板:“ B中的_字符与A中的任何字符匹配(类似于posix正则表达式中的。 ),而B中的%字符与A中任意数量的字符匹配(类似于posix正则表达式中的。*)。例如,“ foobar”(如“ foo”)的计算结果为FALSE,而“ foobar”(如“ foo_ _ _”)的结果为FALSE设为TRUE,“ foobar”也如“ foo%”一样。”因此,对于LIKE运算符,您无需转义'.'

您只需要'.'运算符就可以对RLIKE进行转义以匹配点字符,因为它使用Java正则表达式。