Oracle字串轉行函式
阿新 • • 發佈:2018-12-27
前言
有時候比如一個字串 : namestr 內容:‘張三,李四,王五,劉八,肖六’ 。
一張表:pati_info_basic 欄位:姓名,年齡等..
我們要從該表中查出上述字串包含的所有人的資訊。
此時用:
select * from pati_info_basic where patiname where patiname in namestr
肯定是不行的。而且有時候姓名之間不是用逗號相隔,而是用其他符號相隔的呢?
解決方案
一個實現思路是 :先把namestr字串轉成 張三李四各為一個元組,再用in查詢。
實現步驟:
- 新建型別
CREATE OR REPLACE TYPE "TY_ROW_STR_SPLIT" as object (strValue VARCHAR2 (4000))
CREATE OR REPLACE TYPE "TY_TBL_STR_SPLIT" IS TABLE OF ty_row_str_split
- 新建函式
CREATE OR REPLACE FUNCTION string_split(p_str IN VARCHAR2, p_delimiterView CodeIN VARCHAR2) RETURN ty_tbl_str_split IS j INT := 0; i INT := 1; len INT := 0; len1 INT := 0; str VARCHAR2(4000); str_split ty_tbl_str_split := ty_tbl_str_split(); BEGIN len := LENGTH(p_str); len1 := LENGTH(p_delimiter); WHILE j < len LOOP j := INSTR(p_str, p_delimiter, i); IF j = 0 THEN j := len; str := SUBSTR(p_str, i); str_split.EXTEND; str_split(str_split.COUNT) := ty_row_str_split(strValue => str); IF i >= len THEN EXIT; END IF; ELSE str := SUBSTR(p_str, i, j - i); i := j + len1; str_split.EXTEND; str_split(str_split.COUNT) := ty_row_str_split(strValue => str); END IF; END LOOP; RETURN str_split; END string_split;
- 函式示例
select * from table(string_split('張三||李四||王五||劉八||肖六' ,'||'))
這時候用in查詢就沒問題了,其中‘||’符號可替換為任意符號。