赞
踩
目录
过滤出字符串中包含某字符的数据
(1)用locate()函数判断【推荐比较高效】
我们知道locate()函数可以判断某个字符在字符串中的位置,如果不在该字符串中返回0值,如果在返回字符对应的索引位置。
select locate('1','10002,21002,11001,11001')
- 0: jdbc:hive2://10.9.1.212:10000> select locate('1','10002,21002,11001,11001');
- +------+--+
- | _c0 |
- +------+--+
- | 1 |
- +------+--+
- 1 row selected (0.093 seconds)
- 0: jdbc:hive2://10.9.1.212:10000>
返回值为1说明大于0,表示存在或包含
(2)用like正则匹配【不推荐,效率低】
select '10002,21002,11001,11001' like '%1%';
- 0: jdbc:hive2://10.9.1.212:10000> select '10002,21002,11001,11001' like '%1%';
- +-------+--+
- | _c0 |
- +-------+--+
- | true |
- +-------+--+
- 1 row selected (0.118 seconds)
- 0: jdbc:hive2://10.9.1.212:10000>
- select '10002210021100111001' like '%1%';
- 0: jdbc:hive2://10.9.1.212:10000> select '10002210021100111001' like '%1%';
- +-------+--+
- | _c0 |
- +-------+--+
- | true |
- +-------+--+
- 1 row selected (0.075 seconds)
- 0: jdbc:hive2://10.9.1.212:10000>
返回true值表示包含,存在要找的字符
(3)用regexp正则匹配。注意此时regxp()里面的正则为regexp('.*1.*')
select '10002,21002,11001,11001' regexp('.*1.*');
- 0: jdbc:hive2://10.9.1.212:10000> select '10002,21002,11001,11001' regexp('.*1.*');
- +-------+--+
- | _c0 |
- +-------+--+
- | true |
- +-------+--+
- 1 row selected (0.06 seconds)
具体测试case如下:
(1)regxp()测试
select count(1) from ods_phm_sigmach_lightunit_fea where slight_type regexp('.*1.*');
(2)like模糊匹配测试
select count(1) from ods_phm_sigmach_lightunit_fea where slight_type like '%1%';
(3) locate()函数测试
select count(1) from ods_phm_sigmach_lightunit_fea where locate('1',slight_type) > 0;
由测试的结果看:locate()>regexp()>like
本文讲解了一种利用HQL判断字符串中是否包含某个字符的方法,给出了三种方法,经过测试分析得出使用locate()函数判断效果最高,regexp()函数次之,效率最差的为like模糊匹配,建议慎用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。