17,140
社区成员




SELECT MAX(N) N
FROM (SELECT TO_CHAR(WM_CONCAT(N) OVER(ORDER BY NUM DESC)) N
FROM (SELECT REGEXP_SUBSTR('张三,李四,王五', '[^(;|,)]+', 1, ROWNUM) N,ROWNUM NUM
FROM DUAL
CONNECT BY ROWNUM <= LENGTH(REGEXP_REPLACE('张三,李四,王五','[[:alnum:]]')) + 1))
SELECT TO_CHAR(WM_CONCAT(N))
FROM (SELECT REGEXP_SUBSTR('张三,李四,王五', '[^(;|,)]+', 1, ROWNUM) N
FROM DUAL
CONNECT BY ROWNUM <= LENGTH(REGEXP_REPLACE('张三,李四,王五', '[[:alnum:]]')) + 1
ORDER BY ROWNUM ASC);--ORDER BY ROWNUM DESC[/color]
用下面的写法可能性能就不如上面的了
SELECT SUBSTR(MAX(SYS_CONNECT_BY_PATH(N, ',')), 2) N
FROM (SELECT REGEXP_SUBSTR('张三,李四,王五', '[^(;|,)]+', 1, ROWNUM) N,
LENGTH(REGEXP_REPLACE('张三,李四,王五', '[[:alnum:]]')) + 2 -
ROWNUM NUM
FROM DUAL
CONNECT BY ROWNUM <=LENGTH(REGEXP_REPLACE('张三,李四,王五', '[[:alnum:]]')) + 1
ORDER BY NUM DESC)
START WITH NUM = 1
CONNECT BY NUM = PRIOR NUM + 1
create or replace function func_1(str in varchar2) return varchar2 as
str_new varchar(4000);
begin
for x in (select substr(str,
instr(',' || str, ',', 1, rownum),
instr(str || ',', ',', 1, rownum) -
instr(',' || str, ',', 1, rownum)) keyword
from dual
connect by rownum <= length(str) - length(replace(str, ',')) + 1
order by keyword) loop
str_new := str_new || ',' || x.keyword;
end loop;
return substr(str_new, 2);
end;
select reverse('d,c,b,a') from dual
你这个用这个函数还行,有中文就不行了
有其他需求可以自己写个函数