wm concat 多行字串拼接

2022-03-21 20:02:30 字數 2925 閱讀 9858

一、wm_concat 多行字串拼接

有如下員工部門表emp_dept,資料如下:

;需要實現如下結果

就需要用到wm_concat 函式:

sql如下:

select dept_name 部門, wm_concat(t.emp_name) 員工 from emp_dept t group by dept_name12

但是這樣的查詢結果卻是:

這裡還需要to_char一下

select dept_name 部門, to_char(wm_concat(t.emp_name))員工 from emp_dept t group by dept_name12

如果需要將拼接的字串改為 『;』

select dept_name 部門, replace(to_char(wm_concat(t.emp_name)),',',';')員工 from emp_dept t group by dept_name12

執行結果:

二、字串拆分為多行

有字串 『a,b,c,d,e』需要拆分為:

sql如下:

select regexp_substr('a,b,c,d,e', '[^,]+', 1, rownum) 字串拆分

from dual

connect by rownum <= length(regexp_replace('a,b,c,d,e', '[^,]', null)) + 1;12

3同樣我們可以將銷售部的張三,王五,李**行拆分

with tmp as

(select to_char(wm_concat(t.emp_name)) emp_name

from emp_dept t

where t.dept_name = '銷售部'

group by dept_name)

select regexp_substr(tmp.emp_name, '[^,]+', 1, rownum) 員工

from tmp

connect by rownum <= length(regexp_replace(tmp.emp_name, '[^,]', null)) + 1;

執行結果如下:12

3456

789到這裡,可能有人會像可不可以將一中wm_concat 多行拼接字串的結果全部拆分,答案是肯定,但是用sql語句是無法實現的,需要使用儲存過程,將多行拼接的字串迴圈傳入到上面sql中進行拆分。有興趣的童鞋可以嘗試下,採用游標是最好的選擇。

附上儲存過程**

create or replace procedure tmp_split is

--宣告多行拼接字串查詢游標

cursor cur_string_concat is

select to_char(wm_concat(t.emp_name)) emp_name

from emp_dept t

group by dept_name;

--宣告變數rec_emp_name表示為游標cur_string_concat一行記錄

rec_emp_name cur_string_concat%rowtype;

--宣告拆分字串游標,傳入引數cur_string為需要拆分的字串

cursor cur_string_split(cur_string varchar2) is

select regexp_substr(cur_string, '[^,]+', 1, rownum) e_name

from dual

connect by rownum <=

length(regexp_replace(cur_string, '[^,]', null)) + 1;

--宣告變數rec_string游標cur_string_split的一行記錄

rec_string cur_string_split%rowtype;

begin

--先開啟字串拼接游標

open cur_string_concat;

--開始迴圈

loop

--將cur_string_concat每次迴圈的結果賦值給變數rec_emp_name

fetch cur_string_concat

into rec_emp_name;

--當cur_string_concat迭代完了退出

exit when cur_string_concat%notfound;

open cur_string_split(rec_emp_name.emp_name);

loop

fetch cur_string_split

into rec_string;

exit when cur_string_split%notfound;

--將拆分的結果儲存到表中

insert into tmp_split_emp

select rec_string.e_name from dual t;

end loop;

--一定要關閉游標

close cur_string_split;

end loop;

commit;

close cur_string_concat;

end tmp_split;12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

4142

43執行儲存過程:

begin

tmp_split;

end ;12

3查詢結果為:

拼接字串

border 1 class box 標籤名稱th 是否顯示th 標籤順序th tr thead 首頁td class check 是option 否option select td class number 1option 2option 3option 4option 5option 6opti...

字串拼接

給定兩個字串s1和s2,合併成乙個新的字串s。合併規則為,s1的第乙個字元為s的第乙個字元,將s2的最後乙個字元作為s的第二個字元 將s1的第二個字元作為s的第三個字元,將s2的倒數第二個字元作為s的第四個字元,以此類推。包含多組測試資料,每組測試資料報含兩行,代表長度相等的兩個字串s1和s2 僅由...

字串拼接

本文總結記錄linux c中有關字串的拼接方法,strncat 和 snprintf 函式 一 strncat 實現字串拼接 char strncat char dest,const char src,size t n 宣告,n 為 src 字串長度 char strncat char dest,c...