业务需求:使用hive从表中查询dataforjy字段的记录后5位包含#的有哪些?
方法一:使用模糊查询like,逐一匹配
Like表示模糊查询(是否包含),like后面的字符串不是正则表达式,而是通配符。像mysql中的"like",%代表任意数量个字符,_代表一个填充字符。但是建议使用高级函数"instr"效率更高。
Select dataforjy from fdm_dm.dmp_plsadm_tradeinfo_m_20180227_mix
where dataforjy like '%#____'
or dataforjy like '%_#___'
or dataforjy like '%__#__'
or dataforjy like '%___#_'
or dataforjy like '%____#'
方法二:(通过截取后5位,使用relike查询包含#的记录)
Rlike功能和like一致,只是后面内容是正则表达式,正则的写法与java一样。需要转义,例如'\m'需要使用'\\m'。如果like想用正则表达式,则需要替换用rlike.
Select dataforjy
from fdm_dm.dmp_plsadm_tradeinfo_m_20180227_mix
where substr(dataforjy,length(dataforjy)-4) rlike '#'
注,substr后5位的取法,是dataforjy-4,而不是dataforjy-5。其实dataforjylike ‘%#%’和dataforjyrlike ‘#’效果一样,都是对含#号的匹配。但是上面两种如果dataforjy字段中存在长度小于5的字段,则统计结果都会不准。
方法三:通过给不足字段进行长度补充,让其长度统一
select * from fdm_dm.dmp_plsadm_tradeinfo_m_20180227_mix
where substr(lpad(paystat24month,24,'9'),-5) rlike '#'
RLIKE的其他使用,比如:
hive> select 1 from lxw_dual where 'footbar’ rlike'^f.*r$’; > 1 注意:判断一个字符串是否全为数字: hive> select 1 from lxw_dual where '123456' rlike'^\\d+$'; > 1 hive> select 1 from lxw_dual where '123456aa' rlike'^\\d+$';
Not like表示不包含的匹配,和like相反,但是用法不是Anot like B,而是not A like B .
hive> select not 'abcde' like '%c%e' from fdm_dm.dmp_plsadm_tradeinfo_m_20180227_mix
hive > false
同理NOT RLIKE 的使用,也是NOT A RLIKE B
select PAYSTAT24MONTH
from fdm_dm.dmp_plsadm_tradeinfo_m_20180227_mix
where not substr(PAYSTAT24MONTH,length(PAYSTAT24MONTH)-4) rlike '#'