切字串的方法@ 提姆爬文中 | oracle sql split用法
不要忙著噓我,不是要講instr()與substr啦世事難預料,系統寫定後有(ㄧˊ)時(ㄉㄧㄥˋ)會出現新的需求,有些系統商會預留備用欄以適應客製,像我這種只管自己公司的系統的也難免要留欄位,但只有一個特別欄(special_column),因為需求日增只好把欄寬拉到4000Byte(OracleDB11g及以前,VarChar2的寛度上限*)。4000該很夠用了,只是因不同需求共同同一欄,則必須制定相同的使用方式,現有的規則是像這樣key1=value1[;key2=value2[;key3=value3[....]]]標準確立則使用時便不難處理,vb6中的split()與join()可以很方便的支援這種字串。但問題...
不要忙著噓我,不是要講instr()與substr啦
世事難預料,系統寫定後有(ㄧˊ)時(ㄉㄧㄥˋ)會出現新的需求,有些系統商會預留備用欄以適應客製,像我這種只管自己公司的系統的也難免要留欄位,但只有一個特別欄(special_column),因為需求日增只好把欄寬拉到4000Byte(Oracle DB 11g及以前,VarChar2的寛度上限*)。
4000該很夠用了,只是因不同需求共同同一欄,則必須制定相同的使用方式,現有的規則是像這樣
key1=value1[;key2=value2[;key3=value3[....]]]
標準確立則使用時便不難處理,vb6中的split()與join()可以很方便的支援這種字串。但問題是,當有必要[用SQL式取出一部份指定key的字串]時,僅套用instr()與substr()寫起來超麻煩。
舉例,像這樣利用select ... from dual建一個虛擬的table
從要上圖的9列資料中,抓[計薪年月=]後面的年月出來,抓不到則傳回null(Oracle上空字串視同null),則依上圖來看,第3/6/9列應有傳回值[2016/9]。經過測試後,我寫了一個select ... from (...)把上圖的SQL式包起來,執行結果如圖:
上圖的from ()裏面便是前一個圖的sql式,執行結果便如所求。
對,貼的圖沒有把全部的sql式子亮出來,因為我發現那個式子其實並不重要。剛寫完時我還沾沾自喜了一下,只是像這樣功能須求要應該以前就有了,於是把google大神請出來,尋找看看是否已有先賢發表過解法,我用的搜尋字串是[oracle 11g split string]
我不是要秀英文,只是用中文找到的都是instr()與substr()(最強的也只講到split(),在subquery裏面split()不太合用)。上圖第一個鍵結的內容才是我的正解,使用REGEXP_SUBSTR()才對,把原本的case改掉,這才是重點:
重貼一次
REGEXP_SUBSTR(sp_col, 計薪年月=[;]{7})