日期:2014-05-17  浏览次数:20836 次

ORACLE 的SPLIT
表A有一个字段vertype,存储的值01,02,03;对应表B(vertype,vervalue):01为手机,02为电话,03为电脑;
如何写一个函数让页面展示vertype的时候,如果vertype为01,页面展示位手机;如果为01,02;页面展示为:手机,电话。求指导

------解决方案--------------------
我做过类似的,不过我的编码是固定长度的。
先 len(str)-len(replace,',','') 算出一共几个逗号
然后 loop
用substr(currlen,currlen+2*i)。
------解决方案--------------------

s1 := ','
------解决方案--------------------
'01,02,03'
------解决方案--------------------
',';
for c in select * from B where s1 like '%,'
------解决方案--------------------
vertype
------解决方案--------------------
',%'
loop
  s1 := replace(s1,','
------解决方案--------------------
c.vertype
------解决方案--------------------
',' ,  ','
------解决方案--------------------
c.vervalue
------解决方案--------------------
',');
end loop;
s1 := substr(s1, 2, length(s1)-2);

------解决方案--------------------
引用:
表A有一个字段vertype,存储的值01,02,03;对应表B(vertype,vervalue):01为手机,02为电话,03为电脑;
如何写一个函数让页面展示vertype的时候,如果vertype为01,页面展示位手机;如果为01,02;页面展示为:手机,电话。求指导


前面两个with是模拟数据,后面的是查询结果。

首先使用笛卡尔积,制造结果集,然后利用01,02,03是否在前面的vertype中作为过滤条件,最后使用Oracle的WMSYS.WM_CONCAT函数来归集结果。


WITH a AS(
     SELECT '01,' AS vertype FROM dual UNION
     SELECT '01,02' AS vertype FROM dual UNION
     SELECT '01,02,03' AS vertype FROM dual UNION
     SELECT '01,03' AS vertype FROM dual