重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
oracle 中可以用connect by把字符串按都好分割:
创新互联专业为企业提供高台网站建设、高台做网站、高台网站设计、高台网站制作等企业网站建设、网页设计与制作、高台企业网站模板建站服务,十余年高台做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
比如定义字符串:
pv_no_list :='23,34,45,56';
SELECT DISTINCT REGEXP_SUBSTR (pv_no_list,'[^,]+',1,LEVEL) as "token"
FROM DUAL
CONNECT BY REGEXP_SUBSTR (pv_no_list,'[^,]+',1,LEVEL) IS NOT NULL
order by 1
返回结果:
TOKEN
23
34
45
56
select b,
t.ca,
c.lv,instr(t.ca, ',', 1, c.lv) + 1,
substr(t.ca,
instr(t.ca, ',', 1, c.lv) + 1,
instr(t.ca, ',', 1, c.lv + 1) -
(instr(t.ca, ',', 1, c.lv) + 1)) AS c
from (select b,
',' || c || ',' AS ca,
c,
LENGTH(C),
length(c || ','),
REPLACE(c, ','),
length(REPLACE(c, ',')), --删除逗号的长度
nvl(length(REPLACE(c, ',')), 0), --空值长度为空,因此要将空值替换为0
length(c || ',') - nvl(length(REPLACE(c, ',')), 0) AS cnt --以逗号分隔的字符串个数,先在原来的长度上加1 计算去除所有逗号后字符串长度,再,拿这个
FROM TEST_A) t,
(select LEVEL lv from dual CONNECT BY LEVEL = 100) c
where c.lv = t.cnt --逗号数量在100以内
这个用过程完成比较好,这样的话可以写几个循环,然后一个循环一个循环的来做,比较好解释和控制,而且写得量应该可不大。判断下instr(字符串,n)的位置然后进行截取,以及判断是否为0等,就可以进入和跳出循环。外层则可以是一个游标。遍历class表。这样就可以了。
如果硬要写一个sql,那么这里才几个逗号,如果逗号很大,那么可能要写很多的decode或者case when,而且不是十分好控制。假如有最多21个逗号,那么你就要写22个decode。这个工作量有点大了吧。
写完后,进行行转列,找到username,然后用wm_concat,username合并或者用,最后在根据查到表的id和class的id进行对应,得到查询结果,可是似乎有点太麻烦了。
我尝试用start with做,可是没办法实验,不知道行不行,感觉上似乎可以,但是总觉得哪里不对。