將在一列的以逗號隔開的列資料轉化為行資料顯示的函式

2021-07-03 04:10:55 字數 1717 閱讀 9625

這個是字串分割函式的使用例子

select to_number(strvalue) as value from table(fn_split('1,2,3',','))

select to_char(strvalue) as value from table(fn_split('aa,bb,cc',','))

函式:
create or replace function root.fn_split(

p_str in varchar2,

p_delimiter in 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=0 意味著沒有找到.

-- 可以理解為是查詢到最後乙個單元了.

-- 設定 j := len, 讓外部的迴圈處理可以結束了.

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);

-- 然後設定索引, 下一次再查詢的時候,從指定的索引位置開始(不是從0開始找了)

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 fn_split;

某列同值,合併另一列的值,並用逗號隔開

合併如圖所示的 一班 的同學名字到d列,名字之間以逗號分隔。ab cd1姓名 專業姓名2 專業22 張三語文 張三語文,數學,物理,生物3張三 數學4張三物理5張三 生物 d2的公式 substitute substitute phonetic offset a 1,match c2,a a,1,c...

一列資料轉多行多列

一列資料轉多行多列 方法二 插入行列公式 公式解析 row 的功能是返回引用的行號 column 的功能是返回引用的列號 indirect函式 功能 返回文字字串所指定的引用 語法規則 indirect ref text,a1 ref text 單元格引用,該引用所指向的單元格中存放有對另一單元格的...

excel中兩列匹配,取匹配列的後一列資料

剛在處理excel資料時,遇到如下問題 已知a列的英文名和b列的中文名,現有一批c列的英文名,想根據a b列的對應規則,輸出c列對應的中文名。但是c列的順序和a列順序不一致,也不一定所有內容都被包含在a列。舉例 a b c d prvnce name 省名稱 accs nbr latn name 本...