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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章