Hivesql字符截取函数错用
1.背景
最近在使用instr进行字符截取时出现了字符截断的情况,案例是需要获取出"红河哈尼族矫族自治州(xxxx(红河)有限公司)"里面的"xxxx(红河)有限公司"内容,结果获取到的内容是"xxxx(红河",该语句针对只有一对括号时没有问题,当出现这种有两个括号时就会出现截断的问题,原始语句如下:
substring(cityname,instr(cityname,'(')+1,instr(cityname,')')-(instr(cityname,'(')+1))
2.实施
尝试修改,想法是截取从第一个括号出现到倒数第二个字符是所需的内容,结果获取到的字符内容是"xxxx(红河)有限公司)",多了一个括号,语句如下:
substring('红河哈尼族矫族自治州(xxxx(红河)有限公司)',instr('红河哈尼族矫族自治州(xxxx(红河)有限公司)','(')+1,length('红河哈尼族矫族自治州(xxxx(红河)有限公司)')-1)
相信熟悉substring会轻易的发现这里对substring的参数理解有误差,第一个参数是原始字符串,第二参数是要截取的起始下标,第三个参数是要截取的长度,而不是要截取的结束下标。所以改造一下就是可以的,语句可以这样写。
substring('红河哈尼族矫族自治州(xxxx(红河)有限公司)',instr('红河哈尼族矫族自治州(xxxx(红河)有限公司)','(')+1,length('红河哈尼族矫族自治州(xxxx(红河)有限公司)')-instr('红河哈尼族矫族自治州(xxxx(红河)有限公司)','(')-1)
3.总结
substr和substring用法一样,在截取字符时还可以使用正则表达式,正则表达式内容可以这样写。
regexp_extract('红河哈尼族矫族自治州(xxxx(红河)有限公司)', '\\((.*)\\)', 1)