背景
正则表达式主要应用在字符串的匹配搜索上,而且非常强大。这次遇到的问题就和正则有关
在写SQL的时候,有一列是投诉原因,多选项,不同原因会组合到一起,不同的数字代表不同的投诉类型,现在我想要判断指定的投诉原因是否在里面。
举个栗子
序号 | 投诉原因 |
---|---|
1 | 1,3,5,7,9,10 |
2 | 2,24,25 |
3 | 24,25 |
现在我要判断投诉原因中有2或者3的都算是。
问题
开始的时候正则是
--- regexp_like 是 Presto的正则匹配函数
select
index, --序号
if(regexp_like(aa.feedback_reason,'2|3'),'是','否') as complain_flag --判断
from
table_1 aa
但是结果显示
1 是
2 是
3 是
3为什么结果是“是”???
解决
因为正则写的是
pattern= '2|3'
问题出在这里,序号3的数据里面 str = '24,25' 是包含2的,正则这样写的话,只要出现2就判断为是。可是我们想要的是2而不是24,25。那就得改写正则表达式
pattern = '\b2\b|\b3\b'
看到这里或许你就明白了,\b是在加边界,告诉计算机,我需要的是2这个数字,而不是随便匹配到2就可以。(即24里面的2不是我想要,我要的是有边界的2)
所以解决这个问题的关键就是 单词边界 也就是\b
所以最终的SQL是
select
index,
if(regexp_like(aa.feedback_reason,'\b2\b|\b3\b'),'是','否') as complain_flag
from
table_1 aa
正则表达式在线测试:http://tool.oschina.net/regex/
参考:https://zhidao.baidu.com/question/987099792816138779.html
网友评论