0-需求
过滤出字符串中包含某字符的数据
1-实验
(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
2-总结
- 本文讲解了一种利用HQL判断字符串中是否包含某个字符的方法,给出了三种方法,经过测试分析得出使用locate()函数判断效果最高,regexp()函数次之,效率最差的为like模糊匹配,建议慎用。