ORACLE 10G 怎么通过正则表达式去除重复值? 数据库:ORACLE10G字符串(用/分隔的): AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB我想出来结果:AB/CD/EF/GHIJ/KLMN+OP怎么用regexp_replace函数实现呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 --regexp_replace估计无法实现,下面的方法可以:DECLARE STR_IN VARCHAR2(2000) DEFAULT 'AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB'; V_STR_TEMP VARCHAR2(2000); V_SPLIT VARCHAR2(1) := '/'; V_OUT VARCHAR2(2000) := '';BEGIN V_STR_TEMP := V_SPLIT || STR_IN || V_SPLIT; FOR I IN (SELECT DISTINCT SUBSTR(V_STR_TEMP, INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM) + 1, INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM + 1) - INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM) - 1) BB FROM (SELECT NULL FROM USER_USERS WHERE ROWNUM = 1) CONNECT BY ROWNUM <= LENGTH(STR_IN) - LENGTH(REPLACE(STR_IN, V_SPLIT, '')) + 1 ORDER BY 1) LOOP IF LENGTH(V_OUT) > 0 THEN V_OUT := V_OUT || V_SPLIT || I.BB; ELSE V_OUT := I.BB; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(V_OUT);END;/--输出:AB/CD/EF/GHIJ/KLMN+OP SELECT ltrim(REPLACE(wmsys.wm_concat(DISTINCT regexp_substr('/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB', '/[^\/]+',1,ROWNUM)), ',/','/'),'/')FROM dualCONNECT BY instr('/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB','/',1,ROWNUM) > 0;LTRIM(REPLACE(WMSYS.WM_CONCAT(--------------------------------------------------------------------------------AB/CD/EF/GHIJ/KLMN+OP注意字符串第一个字节必须是/,如果不是,那么加上 楼上的能解释一下这里的CONNECT BY与ROWNUM起什么作用吗 instr和regexp_substr第四个参数(rownum),表示定位指定的字符串(/)在第几次出现的位置。connect by的作用是如果字符串出现N,那么将一条数据(/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB)复制成N条数据。regexp_substr的作用是第N行数据的值(例如第一行数据是/AB)wmsys.wm_concat(DISTINCT 的作用是先去掉重复,再将这几条数据合并成同一个字符串,中间以逗号隔开你可以把那条SQL逐层分解看效果 sqlplus 执行20个存储过程 为什么执行最后一个要耗用很长时间 oracle 导入库时,提示IMP-00032: SQL 语句超过缓冲区长度? 源于oracle job的一个问题 oracle 热备份 按年度查询问题,各位大虾帮帮忙吧~! oracle adduser(资源公享) 关于LTRIM函数的疑问 关于"ORA-00106: 无法在连接到调度程序时启动/关闭数据库"的问题 exp/imp 字符集问题 急救! 在oracle 8.1.7中,怎样才能查找用户的链接数呀,请大虾指点一下? 想写一个split函数拆分字符串,不知道能否实现 这个sql语句怎么写?
DECLARE
STR_IN VARCHAR2(2000) DEFAULT 'AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB';
V_STR_TEMP VARCHAR2(2000);
V_SPLIT VARCHAR2(1) := '/';
V_OUT VARCHAR2(2000) := '';
BEGIN
V_STR_TEMP := V_SPLIT || STR_IN || V_SPLIT;
FOR I IN (SELECT DISTINCT SUBSTR(V_STR_TEMP,
INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM) + 1,
INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM + 1) -
INSTR(V_STR_TEMP, V_SPLIT, 1, ROWNUM) - 1) BB
FROM (SELECT NULL FROM USER_USERS WHERE ROWNUM = 1)
CONNECT BY ROWNUM <=
LENGTH(STR_IN) - LENGTH(REPLACE(STR_IN, V_SPLIT, '')) + 1
ORDER BY 1) LOOP
IF LENGTH(V_OUT) > 0 THEN
V_OUT := V_OUT || V_SPLIT || I.BB;
ELSE
V_OUT := I.BB;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(V_OUT);
END;
/--输出:
AB/CD/EF/GHIJ/KLMN+OP
SELECT ltrim(REPLACE(wmsys.wm_concat(DISTINCT
regexp_substr('/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB',
'/[^\/]+',1,ROWNUM)),
',/','/'),'/')
FROM dual
CONNECT BY instr('/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB','/',1,ROWNUM) > 0;LTRIM(REPLACE(WMSYS.WM_CONCAT(
--------------------------------------------------------------------------------
AB/CD/EF/GHIJ/KLMN+OP
注意字符串第一个字节必须是/,如果不是,那么加上
connect by的作用是如果字符串出现N,那么将一条数据(/AB/AB/CD/CD/CD/CD/CD/EF/GHIJ/GHIJ/AB/CD/KLMN+OP/KLMN+OP/CD/AB)
复制成N条数据。
regexp_substr的作用是第N行数据的值(例如第一行数据是/AB)
wmsys.wm_concat(DISTINCT 的作用是先去掉重复,再将这几条数据合并成同一个字符串,中间以逗号隔开你可以把那条SQL逐层分解看效果