最近遇到orcale数据库的数据用逗号拼接的数据,要把它拆分出来,我一开始在百度上查找大部分都是用的以下这个方法;
TITLE 表数据如下图:
ID NAME
1 TEST1,TEST2
2 TEST3,TEST4
3 TEST4,TEST5
4 TEST1,TEST4
5 TEST2,TEST4,TEST5
测试SQL如下:
SELECT ID, REGEXP_SUBSTR(NAME, '[^,]+', 1, LEVEL) NAME
FROM TITLE
CONNECT BY LEVEL <= REGEXP_COUNT(NAME, '[^,]+')
AND ROWID = PRIOR ROWID
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
ORDER BY NAME;
测试SQL如下:
ID NAME
4 TEST1
1 TEST1
1 TEST2
5 TEST2
2 TEST3
4 TEST4
2 TEST4
5 TEST4
3 TEST4
5 TEST5
3 TEST5
以上方法在数据库端可以用,我放到mybatis里面就报错了报拒接链接一个d开头的一个对象,于是我就换了另一种方式,如果你们上面的方法测试没有问题的话就用,有问题的话就用下面这个方法;
SELECT substr(a.PRO_INVERSION_FLG,
instr(a.PRO_INVERSION_FLG, ',', 1, levels.lvl) + 1,
instr(a.PRO_INVERSION_FLG, ',', 1, levels.lvl + 1) -
(instr(a.PRO_INVERSION_FLG, ',', 1, levels.lvl) + 1)) as PRO_INVERSION_FLG
FROM (SELECT ',' || PRO_INVERSION_FLG || ',' AS PRO_INVERSION_FLG,
length(PRO_INVERSION_FLG) -
nvl(length(REPLACE(PRO_INVERSION_FLG, ',')), 0) + 1 AS cnt
FROM jzsh_gcy_proj_horse) a,
(SELECT rownum AS lvl
FROM (SELECT MAX(length(PRO_INVERSION_FLG || ',') -
nvl(length(REPLACE(PRO_INVERSION_FLG, ',')),
0)) max_len
FROM jzsh_gcy_proj_horse)
CONNECT BY LEVEL <= max_len) levels
WHERE levels.lvl <= a.cnt
也是亲测有效的,表字段PRO_INVERSION_FLG 表名 jzsh_gcy_proj_horse